TransactionSEALED
$!*^#▓$■╳╲▫$*╱~◆*╲#%▒○▓█╱╲╱╱!%&●╲◆●!◆^?╲■░?&$▫◇*╲◆%*◆▒#▫██▒*╳▫■■
Transaction ID
Transaction Summary
TransactionScript Arguments
0pidUInt64
86
1amountUFix64
5791.37413861
2stakeLpTokenAddrAddress?
3stakeTokenPathString?
null
4ifClaimRewardBool
true
5vaultPaths[String]
[ "stFlowTokenVault" ]
Cadence Script
1import Staking from 0x1b77ba4b414de352
2import SwapConfig from 0xb78ef7afa52ff906
3import SwapFactory from 0xb063c16cac85dbd1
4import FungibleToken from 0xf233dcee88fe0abe
5import stFlowToken from 0xd6f80565193ad727
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/stFlowTokenVault) == nil {
11 signer.storage.save(<-stFlowToken.createEmptyVault(vaultType:Type<@stFlowToken.Vault>()), to: /storage/stFlowTokenVault)
12 signer.capabilities.publish(
13 signer.capabilities.storage.issue<&{FungibleToken.Receiver}>(/storage/stFlowTokenVault),
14 at: /public/stFlowTokenReceiver
15 )
16 signer.capabilities.publish(
17 signer.capabilities.storage.issue<&{FungibleToken.Balance}>(/storage/stFlowTokenVault),
18 at: /public/stFlowTokenBalance
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}