@@ -10,7 +10,9 @@ import (
10
10
// a new Vault instance and stores it in storage.
11
11
// balance is an argument to the Vault constructor.
12
12
// The Vault must have been deployed already.
13
- func GenerateCreateTokenScript (fungibleAddr , tokenAddr flow.Address , tokenName , storageName string ) []byte {
13
+ func GenerateCreateTokenScript (fungibleAddr , tokenAddr flow.Address , tokenName string ) []byte {
14
+ storageName := MakeFirstLowerCase (tokenName )
15
+
14
16
template := `
15
17
import FungibleToken from 0x%[1]s
16
18
import %[3]s from 0x%[2]s
@@ -21,7 +23,7 @@ func GenerateCreateTokenScript(fungibleAddr, tokenAddr flow.Address, tokenName,
21
23
let vault <- %[3]s.createEmptyVault()
22
24
acct.save(<-vault, to: /storage/%[4]sVault)
23
25
24
- acct.link<&%[3]s.Vault {FungibleToken.Receiver}>(/public/%[4]sReceiver, target: /storage/%[4]sVault)
26
+ acct.link<&{FungibleToken.Receiver}>(/public/%[4]sReceiver, target: /storage/%[4]sVault)
25
27
acct.link<&%[3]s.Vault{FungibleToken.Balance}>(/public/%[4]sBalance, target: /storage/%[4]sVault)
26
28
}
27
29
}
@@ -31,7 +33,9 @@ func GenerateCreateTokenScript(fungibleAddr, tokenAddr flow.Address, tokenName,
31
33
32
34
// GenerateDestroyVaultScript creates a script that withdraws
33
35
// tokens from a vault and destroys the tokens
34
- func GenerateDestroyVaultScript (fungibleAddr , tokenAddr flow.Address , tokenName , storageName string , withdrawAmount int ) []byte {
36
+ func GenerateDestroyVaultScript (fungibleAddr , tokenAddr flow.Address , tokenName string , withdrawAmount int ) []byte {
37
+ storageName := MakeFirstLowerCase (tokenName )
38
+
35
39
template := `
36
40
import FungibleToken from 0x%[1]s
37
41
import %[3]s from 0x%[2]s
@@ -55,7 +59,9 @@ func GenerateDestroyVaultScript(fungibleAddr, tokenAddr flow.Address, tokenName,
55
59
56
60
// GenerateTransferVaultScript creates a script that withdraws an tokens from an account
57
61
// and deposits it to another account's vault
58
- func GenerateTransferVaultScript (fungibleAddr , tokenAddr flow.Address , receiverAddr flow.Address , tokenName , storageName string , amount int ) []byte {
62
+ func GenerateTransferVaultScript (fungibleAddr , tokenAddr flow.Address , receiverAddr flow.Address , tokenName string , amount int ) []byte {
63
+ storageName := MakeFirstLowerCase (tokenName )
64
+
59
65
template := `
60
66
import FungibleToken from 0x%s
61
67
import %s from 0x%s
@@ -64,10 +70,10 @@ func GenerateTransferVaultScript(fungibleAddr, tokenAddr flow.Address, receiverA
64
70
prepare(acct: AuthAccount) {
65
71
let recipient = getAccount(0x%s)
66
72
67
- let providerRef = acct.borrow<&%s.Vault {FungibleToken.Provider}>(from: /storage/%sVault)
73
+ let providerRef = acct.borrow<&{FungibleToken.Provider}>(from: /storage/%sVault)
68
74
?? panic("Could not borrow Provider reference to the Vault!")
69
75
70
- let receiverRef = recipient.getCapability(/public/%sReceiver)!.borrow<&%s.Vault {FungibleToken.Receiver}>()
76
+ let receiverRef = recipient.getCapability(/public/%sReceiver)!.borrow<&{FungibleToken.Receiver}>()
71
77
?? panic("Could not borrow receiver reference to the recipient's Vault")
72
78
73
79
let tokens <- providerRef.withdraw(amount: %d.0)
@@ -77,19 +83,21 @@ func GenerateTransferVaultScript(fungibleAddr, tokenAddr flow.Address, receiverA
77
83
}
78
84
`
79
85
80
- return []byte (fmt .Sprintf (template , fungibleAddr , tokenName , tokenAddr , receiverAddr , tokenName , storageName , storageName , tokenName , amount ))
86
+ return []byte (fmt .Sprintf (template , fungibleAddr , tokenName , tokenAddr , receiverAddr , storageName , storageName , amount ))
81
87
}
82
88
83
89
// GenerateMintTokensScript creates a script that uses the admin resource
84
90
// to mint new tokens and deposit them in a Vault
85
- func GenerateMintTokensScript (fungibleAddr , tokenAddr flow.Address , receiverAddr flow.Address , tokenName , storageName string , amount float64 ) []byte {
91
+ func GenerateMintTokensScript (fungibleAddr , tokenAddr flow.Address , receiverAddr flow.Address , tokenName string , amount float64 ) []byte {
92
+ storageName := MakeFirstLowerCase (tokenName )
93
+
86
94
template := `
87
95
import FungibleToken from 0x%[1]s
88
96
import %[3]s from 0x%[2]s
89
97
90
98
transaction {
91
99
let tokenAdmin: &%[3]s.Administrator
92
- let tokenReceiver: &%[3]s.Vault {FungibleToken.Receiver}
100
+ let tokenReceiver: &{FungibleToken.Receiver}
93
101
94
102
prepare(signer: AuthAccount) {
95
103
self.tokenAdmin = signer
@@ -98,7 +106,7 @@ func GenerateMintTokensScript(fungibleAddr, tokenAddr flow.Address, receiverAddr
98
106
99
107
self.tokenReceiver = getAccount(0x%[5]s)
100
108
.getCapability(/public/%[4]sReceiver)!
101
- .borrow<&%[3]s.Vault {FungibleToken.Receiver}>()
109
+ .borrow<&{FungibleToken.Receiver}>()
102
110
?? panic("Unable to borrow receiver reference")
103
111
}
104
112
@@ -118,7 +126,9 @@ func GenerateMintTokensScript(fungibleAddr, tokenAddr flow.Address, receiverAddr
118
126
119
127
// GenerateBurnTokensScript creates a script that uses the admin resource
120
128
// to destroy tokens and deposit them in a Vault
121
- func GenerateBurnTokensScript (fungibleAddr , tokenAddr flow.Address , tokenName , storageName string , amount int ) []byte {
129
+ func GenerateBurnTokensScript (fungibleAddr , tokenAddr flow.Address , tokenName string , amount int ) []byte {
130
+ storageName := MakeFirstLowerCase (tokenName )
131
+
122
132
template := `
123
133
import FungibleToken from 0x%[1]s
124
134
import %[3]s from 0x%[2]s
@@ -154,10 +164,44 @@ func GenerateBurnTokensScript(fungibleAddr, tokenAddr flow.Address, tokenName, s
154
164
return []byte (fmt .Sprintf (template , fungibleAddr , tokenAddr , tokenName , storageName , amount ))
155
165
}
156
166
167
+ // GenerateTransferInvalidVaultScript creates a script that withdraws an tokens from an account
168
+ // and tries to deposit it into a vault of the wrong type. Should fail
169
+ func GenerateTransferInvalidVaultScript (fungibleAddr , tokenAddr , otherTokenAddr , receiverAddr flow.Address , tokenName , otherTokenName string , amount int ) []byte {
170
+ storageName := MakeFirstLowerCase (tokenName )
171
+
172
+ otherStorageName := MakeFirstLowerCase (tokenName )
173
+
174
+ template := `
175
+ import FungibleToken from 0x%s
176
+ import %s from 0x%s
177
+ import %s from 0x%s
178
+
179
+ transaction {
180
+ prepare(acct: AuthAccount) {
181
+ let recipient = getAccount(0x%s)
182
+
183
+ let providerRef = acct.borrow<&{FungibleToken.Provider}>(from: /storage/%sVault)
184
+ ?? panic("Could not borrow Provider reference to the Vault!")
185
+
186
+ let receiverRef = recipient.getCapability(/public/%sReceiver)!.borrow<&{FungibleToken.Receiver}>()
187
+ ?? panic("Could not borrow receiver reference to the recipient's Vault")
188
+
189
+ let tokens <- providerRef.withdraw(amount: %d.0)
190
+
191
+ receiverRef.deposit(from: <-tokens)
192
+ }
193
+ }
194
+ `
195
+
196
+ return []byte (fmt .Sprintf (template , fungibleAddr , tokenName , tokenAddr , otherTokenName , otherTokenAddr , receiverAddr , storageName , otherStorageName , amount ))
197
+ }
198
+
157
199
// GenerateInspectVaultScript creates a script that retrieves a
158
200
// Vault from the array in storage and makes assertions about
159
201
// its balance. If these assertions fail, the script panics.
160
- func GenerateInspectVaultScript (fungibleAddr , tokenAddr , userAddr flow.Address , tokenName , storageName string , expectedBalance float64 ) []byte {
202
+ func GenerateInspectVaultScript (fungibleAddr , tokenAddr , userAddr flow.Address , tokenName string , expectedBalance float64 ) []byte {
203
+ storageName := MakeFirstLowerCase (tokenName )
204
+
161
205
template := `
162
206
import FungibleToken from 0x%[1]s
163
207
import %[3]s from 0x%[2]s
@@ -180,6 +224,7 @@ func GenerateInspectVaultScript(fungibleAddr, tokenAddr, userAddr flow.Address,
180
224
// the total supply of tokens in existence
181
225
// and makes assertions about the number
182
226
func GenerateInspectSupplyScript (fungibleAddr , tokenAddr flow.Address , tokenName string , expectedSupply int ) []byte {
227
+
183
228
template := `
184
229
import FungibleToken from 0x%[1]s
185
230
import %[3]s from 0x%[2]s
@@ -194,3 +239,30 @@ func GenerateInspectSupplyScript(fungibleAddr, tokenAddr flow.Address, tokenName
194
239
195
240
return []byte (fmt .Sprintf (template , fungibleAddr , tokenAddr , tokenName , expectedSupply ))
196
241
}
242
+
243
+ // GenerateCreateForwarderScript creates a script that instantiates
244
+ // a new forwarder instance in an account
245
+ func GenerateCreateForwarderScript (fungibleAddr , forwardingAddr , receiverAddr flow.Address , tokenName string ) []byte {
246
+ storageName := MakeFirstLowerCase (tokenName )
247
+
248
+ template := `
249
+ import FungibleToken from 0x%[1]s
250
+ import TokenForwarding from 0x%[2]s
251
+
252
+ transaction {
253
+
254
+ prepare(acct: AuthAccount) {
255
+ let recipient = getAccount(0x%[4]s).getCapability(/public/%[3]sReceiver)!
256
+
257
+ let vault <- TokenForwarding.createNewForwarder(recipient: recipient)
258
+ acct.save(<-vault, to: /storage/%[3]sForwarder)
259
+
260
+ if acct.getCapability(/public/%[3]sReceiver)!.borrow<&{FungibleToken.Receiver}>() != nil {
261
+ acct.unlink(/public/%[3]sReceiver)
262
+ }
263
+ acct.link<&{FungibleToken.Receiver}>(/public/%[3]sReceiver, target: /storage/%[3]sForwarder)
264
+ }
265
+ }
266
+ `
267
+ return []byte (fmt .Sprintf (template , fungibleAddr , forwardingAddr , storageName , receiverAddr ))
268
+ }
0 commit comments