TransactionSEALED

$!*^#▓$■╳╲▫$*╱~◆*╲#%▒○▓█╱╲╱╱!%&●╲◆●!◆^?╲■░?&$▫◇*╲◆%*◆▒#▫██▒*╳▫■■

Transaction ID

Timestamp

Sep 05, 2024, 12:47:02 PM UTC
1y ago

Block Height

86,041,824

Computation

0

Proposerseq:13 key:0

Authorizers

1

Transaction Summary

Transaction

Script 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}