Skip to content

Commit fb761b3

Browse files
committed
add utiity for transfer FLOW
1 parent 05d97a0 commit fb761b3

File tree

3 files changed

+53
-57
lines changed

3 files changed

+53
-57
lines changed

fvm/blueprints/token.go

+19
Original file line numberDiff line numberDiff line change
@@ -141,3 +141,22 @@ func MintFlowTokenTransaction(
141141
AddArgument(initialSupplyArg).
142142
AddAuthorizer(service)
143143
}
144+
145+
func TransferFlowTokenTransaction(
146+
authorizer, to flow.Address,
147+
amount string,
148+
env templates.Environment,
149+
) *flow.TransactionBody {
150+
cadenceAmount, _ := cadence.NewUFix64(amount)
151+
txScript := templates.GenerateTransferGenericVaultWithAddressScript(env)
152+
return flow.NewTransactionBody().
153+
SetScript([]byte(
154+
txScript,
155+
),
156+
).
157+
AddArgument(jsoncdc.MustEncode(cadenceAmount)).
158+
AddArgument(jsoncdc.MustEncode(cadence.NewAddress(to))).
159+
AddArgument(jsoncdc.MustEncode(cadence.NewAddress(flow.HexToAddress(env.FlowTokenAddress)))).
160+
AddArgument(jsoncdc.MustEncode(cadence.String("FlowToken"))).
161+
AddAuthorizer(authorizer)
162+
}

fvm/fvm_test.go

+16-45
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import (
2626
"github.com/onflow/cadence/test_utils/runtime_utils"
2727
"github.com/onflow/crypto"
2828
"github.com/onflow/flow-core-contracts/lib/go/contracts"
29-
"github.com/onflow/flow-core-contracts/lib/go/templates"
3029
bridge "github.com/onflow/flow-evm-bridge"
3130
flowsdk "github.com/onflow/flow-go-sdk"
3231
"github.com/onflow/flow-go-sdk/test"
@@ -3144,16 +3143,7 @@ func TestVMBridge(t *testing.T) {
31443143

31453144
sc := systemcontracts.SystemContractsForChain(chain.ChainID())
31463145

3147-
env := templates.Environment{
3148-
ServiceAccountAddress: chain.ServiceAddress().String(),
3149-
FungibleTokenAddress: sc.FungibleToken.Address.Hex(),
3150-
FlowTokenAddress: sc.FlowToken.Address.Hex(),
3151-
EVMAddress: sc.EVMContract.Address.Hex(),
3152-
ViewResolverAddress: chain.ServiceAddress().String(),
3153-
FungibleTokenMetadataViewsAddress: sc.FungibleToken.Address.Hex(),
3154-
MetadataViewsAddress: sc.NonFungibleToken.Address.Hex(),
3155-
BurnerAddress: chain.ServiceAddress().String(),
3156-
}
3146+
env := sc.AsTemplateEnv()
31573147

31583148
bridgeEnv := bridge.Environment{
31593149
CrossVMNFTAddress: env.ServiceAccountAddress,
@@ -3195,25 +3185,21 @@ func TestVMBridge(t *testing.T) {
31953185
chain)
31963186
require.NoError(t, err)
31973187

3198-
txBody := transferTokensTx(chain).
3199-
AddAuthorizer(chain.ServiceAddress()).
3200-
AddArgument(jsoncdc.MustEncode(cadence.UFix64(2.0))).
3201-
AddArgument(jsoncdc.MustEncode(cadence.NewAddress(accounts[0])))
3202-
3203-
txBody.SetProposalKey(chain.ServiceAddress(), 0, 0)
3204-
txBody.SetPayer(chain.ServiceAddress())
3205-
3206-
err = testutil.SignEnvelope(
3207-
txBody,
3188+
txBody := blueprints.TransferFlowTokenTransaction(
32083189
chain.ServiceAddress(),
3209-
unittest.ServiceAccountPrivateKey,
3190+
accounts[0],
3191+
"2.0",
3192+
env,
32103193
)
3194+
3195+
err = testutil.SignTransactionAsServiceAccount(txBody, 0, chain)
32113196
require.NoError(t, err)
32123197

32133198
executionSnapshot, output, err := vm.Run(
32143199
ctx,
32153200
fvm.Transaction(txBody, 0),
32163201
snapshotTree)
3202+
32173203
require.NoError(t, err)
32183204
require.NoError(t, output.Err)
32193205

@@ -3382,18 +3368,7 @@ func TestVMBridge(t *testing.T) {
33823368

33833369
sc := systemcontracts.SystemContractsForChain(chain.ChainID())
33843370

3385-
env := templates.Environment{
3386-
ServiceAccountAddress: chain.ServiceAddress().String(),
3387-
FungibleTokenAddress: sc.FungibleToken.Address.Hex(),
3388-
FlowTokenAddress: sc.FlowToken.Address.Hex(),
3389-
EVMAddress: sc.EVMContract.Address.Hex(),
3390-
ViewResolverAddress: chain.ServiceAddress().String(),
3391-
FungibleTokenMetadataViewsAddress: sc.FungibleToken.Address.Hex(),
3392-
MetadataViewsAddress: sc.NonFungibleToken.Address.Hex(),
3393-
NonFungibleTokenAddress: sc.NonFungibleToken.Address.Hex(),
3394-
CrossVMMetadataViewsAddress: sc.NonFungibleToken.Address.Hex(),
3395-
BurnerAddress: chain.ServiceAddress().String(),
3396-
}
3371+
env := sc.AsTemplateEnv()
33973372

33983373
bridgeEnv := bridge.Environment{
33993374
CrossVMNFTAddress: env.ServiceAccountAddress,
@@ -3435,25 +3410,21 @@ func TestVMBridge(t *testing.T) {
34353410
chain)
34363411
require.NoError(t, err)
34373412

3438-
txBody := transferTokensTx(chain).
3439-
AddAuthorizer(chain.ServiceAddress()).
3440-
AddArgument(jsoncdc.MustEncode(cadence.UFix64(2.0))).
3441-
AddArgument(jsoncdc.MustEncode(cadence.NewAddress(accounts[0])))
3442-
3443-
txBody.SetProposalKey(chain.ServiceAddress(), 0, 0)
3444-
txBody.SetPayer(chain.ServiceAddress())
3445-
3446-
err = testutil.SignEnvelope(
3447-
txBody,
3413+
txBody := blueprints.TransferFlowTokenTransaction(
34483414
chain.ServiceAddress(),
3449-
unittest.ServiceAccountPrivateKey,
3415+
accounts[0],
3416+
"2.0",
3417+
env,
34503418
)
3419+
3420+
err = testutil.SignTransactionAsServiceAccount(txBody, 0, chain)
34513421
require.NoError(t, err)
34523422

34533423
executionSnapshot, output, err := vm.Run(
34543424
ctx,
34553425
fvm.Transaction(txBody, 0),
34563426
snapshotTree)
3427+
34573428
require.NoError(t, err)
34583429
require.NoError(t, output.Err)
34593430

fvm/systemcontracts/system_contracts.go

+18-12
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ const (
4141
ContractNameNonFungibleToken = "NonFungibleToken"
4242
ContractNameMetadataViews = "MetadataViews"
4343
ContractNameViewResolver = "ViewResolver"
44+
ContractNameCrossVMMetadataViews = "CrossVMMetadataViews"
4445
ContractNameEVM = "EVM"
4546
ContractNameBurner = "Burner"
4647
ContractNameCrypto = "Crypto"
@@ -174,9 +175,10 @@ type SystemContracts struct {
174175
FungibleTokenMetadataViews SystemContract
175176

176177
// NFT related contracts
177-
NonFungibleToken SystemContract
178-
MetadataViews SystemContract
179-
ViewResolver SystemContract
178+
NonFungibleToken SystemContract
179+
MetadataViews SystemContract
180+
ViewResolver SystemContract
181+
CrossVMMetadataViews SystemContract
180182

181183
// EVM related contracts
182184
EVMContract SystemContract
@@ -212,9 +214,10 @@ func (c SystemContracts) AsTemplateEnv() templates.Environment {
212214
FungibleTokenSwitchboardAddress: c.FungibleTokenSwitchboard.Address.Hex(),
213215
FungibleTokenMetadataViewsAddress: c.FungibleTokenMetadataViews.Address.Hex(),
214216

215-
NonFungibleTokenAddress: c.NonFungibleToken.Address.Hex(),
216-
MetadataViewsAddress: c.MetadataViews.Address.Hex(),
217-
ViewResolverAddress: c.ViewResolver.Address.Hex(),
217+
NonFungibleTokenAddress: c.NonFungibleToken.Address.Hex(),
218+
MetadataViewsAddress: c.MetadataViews.Address.Hex(),
219+
CrossVMMetadataViewsAddress: c.CrossVMMetadataViews.Address.Hex(),
220+
ViewResolverAddress: c.ViewResolver.Address.Hex(),
218221

219222
BurnerAddress: c.Burner.Address.Hex(),
220223
CryptoAddress: c.Crypto.Address.Hex(),
@@ -243,6 +246,7 @@ func (c SystemContracts) All() []SystemContract {
243246
c.NonFungibleToken,
244247
c.MetadataViews,
245248
c.ViewResolver,
249+
c.CrossVMMetadataViews,
246250

247251
c.EVMContract,
248252
// EVMStorage is not included here, since it is not a contract
@@ -393,9 +397,10 @@ func init() {
393397
ContractNameFungibleTokenSwitchboard: nthAddressFunc(FungibleTokenAccountIndex),
394398
ContractNameFungibleTokenMetadataViews: nthAddressFunc(FungibleTokenAccountIndex),
395399

396-
ContractNameNonFungibleToken: nftTokenAddressFunc,
397-
ContractNameMetadataViews: nftTokenAddressFunc,
398-
ContractNameViewResolver: nftTokenAddressFunc,
400+
ContractNameNonFungibleToken: nftTokenAddressFunc,
401+
ContractNameMetadataViews: nftTokenAddressFunc,
402+
ContractNameViewResolver: nftTokenAddressFunc,
403+
ContractNameCrossVMMetadataViews: nftTokenAddressFunc,
399404

400405
ContractNameEVM: serviceAddressFunc,
401406
AccountNameEVMStorage: evmStorageEVMFunc,
@@ -453,9 +458,10 @@ func init() {
453458
FungibleTokenMetadataViews: addressOfContract(ContractNameFungibleTokenMetadataViews),
454459
FungibleTokenSwitchboard: addressOfContract(ContractNameFungibleTokenSwitchboard),
455460

456-
NonFungibleToken: addressOfContract(ContractNameNonFungibleToken),
457-
MetadataViews: addressOfContract(ContractNameMetadataViews),
458-
ViewResolver: addressOfContract(ContractNameViewResolver),
461+
NonFungibleToken: addressOfContract(ContractNameNonFungibleToken),
462+
MetadataViews: addressOfContract(ContractNameMetadataViews),
463+
ViewResolver: addressOfContract(ContractNameViewResolver),
464+
CrossVMMetadataViews: addressOfContract(ContractNameCrossVMMetadataViews),
459465

460466
EVMContract: addressOfContract(ContractNameEVM),
461467
EVMStorage: addressOfAccount(AccountNameEVMStorage),

0 commit comments

Comments
 (0)