TransactionSEALED
╱@□▫&▫?░@▒○◇%■□◇@□█●▪■$^□╳▪@●@%?▪^&#░█╲?#□%╱●○▒▒~*█@▫#○@#◇$●■◆%▒
Transaction ID
Execution Fee
0.00002485 FLOWTransaction Summary
Contract CallCalled Staking, SwapConfig, SwapFactory +2 more
Script Arguments
0pidUInt64
104
1amountUFix64
15833119.07314391
2stakeLpTokenAddrAddress?
null
3stakeTokenPathString?
TopShotBETAVault
4ifClaimRewardBool
true
5vaultPaths[String]
[ "TopShotBETAVault" ]
Cadence Script
1import Staking from 0x1b77ba4b414de352
2import SwapConfig from 0xb78ef7afa52ff906
3import SwapFactory from 0xb063c16cac85dbd1
4import FungibleToken from 0xf233dcee88fe0abe
5import TopShotBETA from 0xee09029f1dbcd9d1
6
7
8transaction(pid: UInt64, amount: UFix64, stakeLpTokenAddr: Address?, stakeTokenPath: String?, ifClaimReward: Bool, vaultPaths: [String]) {
9 prepare(signer: auth(Storage, Capabilities) &Account) {
10 if signer.storage.borrow<&{FungibleToken.Vault}>(from: /storage/TopShotBETAVault) == nil {
11 signer.storage.save(<-TopShotBETA.createEmptyVault(vaultType:Type<@TopShotBETA.Vault>()), to: /storage/TopShotBETAVault)
12 signer.capabilities.publish(
13 signer.capabilities.storage.issue<&{FungibleToken.Receiver}>(/storage/TopShotBETAVault),
14 at: /public/TopShotBETAReceiver
15 )
16 signer.capabilities.publish(
17 signer.capabilities.storage.issue<&{FungibleToken.Balance}>(/storage/TopShotBETAVault),
18 at: /public/TopShotBETAMetadata
19 )
20 }
21
22 let tokenVaults: {String: &{FungibleToken.Vault}} = {}
23 if (ifClaimReward == true) {
24 for path in vaultPaths {
25 let vaultRef = signer.storage.borrow<&{FungibleToken.Vault}>(from: StoragePath(identifier: path)!)!
26 let key = SwapConfig.SliceTokenTypeIdentifierFromVaultType(vaultTypeIdentifier: vaultRef.getType().identifier)
27 tokenVaults[key] = vaultRef
28 }
29 }
30
31 if signer.storage.borrow<&{Staking.IdentityCertificate}>(from: Staking.UserCertificateStoragePath) == nil {
32 destroy <-signer.storage.load<@AnyResource>(from: Staking.UserCertificateStoragePath)
33 let userCertificate <- Staking.setupUser()
34 signer.storage.save(<-userCertificate, to: Staking.UserCertificateStoragePath)
35 }
36 let userCertificate = signer.storage.borrow<&{Staking.IdentityCertificate}>(from: Staking.UserCertificateStoragePath)!
37
38 let collectionRef = getAccount(0x1b77ba4b414de352).capabilities.borrow<&{Staking.PoolCollectionPublic}>(Staking.CollectionPublicPath)!
39 let pool = collectionRef.getPool(pid: pid)
40
41 // claim rewards
42 if (ifClaimReward == true) {
43 let rewards <- pool.claimRewards(userCertificate: userCertificate)
44
45 let keys = rewards.keys
46 for key in keys {
47 let rewardVaultRef = &rewards[key] as auth(FungibleToken.Withdraw) &{FungibleToken.Vault}?
48 tokenVaults[key]!.deposit(from: <- rewardVaultRef!.withdraw(amount: rewardVaultRef!.balance))
49 }
50 destroy rewards
51 }
52
53 // unstake
54 let unstakingVault <- pool.unstake(userCertificate: userCertificate, amount: amount)
55 if stakeLpTokenAddr != nil {
56 var lpTokenCollectionRef = signer.storage.borrow<&SwapFactory.LpTokenCollection>(from: SwapConfig.LpTokenCollectionStoragePath)
57 lpTokenCollectionRef!.deposit(pairAddr: stakeLpTokenAddr!, lpTokenVault: <- unstakingVault)
58 } else {
59 let vaultRef = signer.storage.borrow<&{FungibleToken.Vault}>(from: StoragePath(identifier: stakeTokenPath!)!)!
60 vaultRef.deposit(from: <- unstakingVault)
61 }
62 }
63}