From 2716a644502182392dd8fdd1aac876522bdea530 Mon Sep 17 00:00:00 2001 From: William Poulin Date: Thu, 4 Jan 2024 17:26:48 -0500 Subject: [PATCH] fix(apps): Migrated app tokens to ATI (#3173) * fix(apps): Migrated app tokens to ATI * fix(euler): Deleted app * more migration * more * more * more * more * more * more * more * deleted disabled app * fix-build --- .../aave-safety-module.module.ts | 2 - .../contracts/abis/aave-abpt.json | 574 ----- .../contracts/abis/aave-bpt.json | 771 ------ .../contracts/abis/aave-stk-apy-helper.json | 161 -- .../contracts/viem.contract-factory.ts | 17 +- .../contracts/viem/AaveAbpt.ts | 1277 ---------- .../contracts/viem/AaveBpt.ts | 1644 ------------- .../contracts/viem/AaveStkApyHelper.ts | 465 ---- .../contracts/viem/index.ts | 6 - .../aave-safety-module.abpt.token-fetcher.ts | 97 - src/apps/across/across.module.ts | 8 +- .../common/across.pool-v1.token-fetcher.ts | 61 - .../contracts/abis/across-pool-v-1.json | 1635 ------------- .../across/contracts/viem.contract-factory.ts | 5 +- .../across/contracts/viem/AcrossPoolV1.ts | 1649 ------------- src/apps/across/contracts/viem/index.ts | 2 - .../ethereum/across.pool-v1.token-fetcher.ts | 18 - src/apps/alpha-v1/alpha-v1.module.ts | 11 - src/apps/alpha-v1/assets/logo.png | Bin 31307 -> 0 bytes .../alpha-v1/contracts/abis/alpha-bank.json | 846 ------- src/apps/alpha-v1/contracts/index.ts | 4 - .../contracts/viem.contract-factory.ts | 17 - src/apps/alpha-v1/contracts/viem/AlphaBank.ts | 860 ------- src/apps/alpha-v1/contracts/viem/index.ts | 7 - .../alpha-v1.lending.token-fetcher.ts | 80 - src/apps/aura/aura.module.ts | 2 - .../abis/aura-bal-staking-token.json | 479 ---- .../aura/contracts/viem.contract-factory.ts | 4 - .../contracts/viem/AuraBalStakingToken.ts | 1130 --------- src/apps/aura/contracts/viem/index.ts | 2 - .../aura.staked-aura-bal.token-fetcher.ts | 53 - src/apps/balancer-v2/balancer-v2.module.ts | 4 - .../balancer-v2.static-yield.token-fetcher.ts | 35 - .../abis/balancer-static-a-token.json | 629 ----- .../abis/balancer-wrapped-aave-token.json | 465 ---- .../contracts/viem.contract-factory.ts | 8 - .../contracts/viem/BalancerStaticAToken.ts | 643 ----- .../viem/BalancerWrappedAaveToken.ts | 1067 --------- src/apps/balancer-v2/contracts/viem/index.ts | 4 - .../balancer-v2.wrapped-aave.token-fetcher.ts | 44 - .../balancer-v2.static-yield.token-fetcher.ts | 14 - src/apps/bancor-v3/bancor-v3.module.ts | 2 - .../bancor-v3.bnt-pool.token-fetcher.ts | 61 - src/apps/concentrator/concentrator.module.ts | 4 - .../concentrator.abc.token-fetcher.ts | 42 - .../concentrator.compounder.token-fetcher.ts | 45 - .../dfx/common/dfx.curve.token-fetcher.ts | 50 - src/apps/dfx/dfx.module.ts | 4 - .../dfx/ethereum/dfx.curve.token-fetcher.ts | 16 - .../dfx/polygon/dfx.curve.token-fetcher.ts | 15 - ...c154b66cb340f3ae24111cc767e0184ed00cc6.png | Bin 28098 -> 0 bytes ...a021b0a9b958b5e75ce9f6dff97c7ee52cb3e6.png | Bin 29310 -> 0 bytes src/apps/dinero/assets/logo.png | Bin 197207 -> 0 bytes .../dinero/contracts/abis/dinero-apxeth.json | 1161 --------- .../dinero/contracts/abis/dinero-pxeth.json | 778 ------ src/apps/dinero/contracts/index.ts | 4 - .../dinero/contracts/viem.contract-factory.ts | 20 - .../dinero/contracts/viem/DineroApxeth.ts | 1175 --------- src/apps/dinero/contracts/viem/DineroPxeth.ts | 792 ------ src/apps/dinero/contracts/viem/index.ts | 9 - src/apps/dinero/dinero.module.ts | 12 - .../ethereum/dinero.apxeth.token-fetcher.ts | 46 - .../ethereum/dinero.pxeth.token-fetcher.ts | 41 - src/apps/euler/assets/logo.png | Bin 11483 -> 0 bytes .../common/euler.api.staking-registry.ts | 87 - .../common/euler.d-token.token-fetcher.ts | 65 - .../common/euler.e-token.token-fetcher.ts | 77 - .../common/euler.p-token.token-fetcher.ts | 58 - .../common/euler.token-definition-resolver.ts | 102 - .../contracts/abis/euler-dtoken-contract.json | 1193 ---------- .../contracts/abis/euler-etoken-contract.json | 1348 ----------- .../contracts/abis/euler-ptoken-contract.json | 310 --- .../abis/euler-staking-rewards-contract.json | 310 --- src/apps/euler/contracts/index.ts | 4 - .../euler/contracts/viem.contract-factory.ts | 31 - .../contracts/viem/EulerDtokenContract.ts | 1207 ---------- .../contracts/viem/EulerEtokenContract.ts | 1362 ----------- .../contracts/viem/EulerPtokenContract.ts | 324 --- .../viem/EulerStakingRewardsContract.ts | 652 ----- src/apps/euler/contracts/viem/index.ts | 13 - .../ethereum/euler.d-token.token-fetcher.ts | 11 - .../ethereum/euler.e-token.token-fetcher.ts | 11 - .../ethereum/euler.p-token.token-fetcher.ts | 10 - .../ethereum/euler.position-presenter.ts | 28 - ...-staking-farm.contract-position-fetcher.ts | 83 - src/apps/euler/euler.module.ts | 26 - .../polygon/furucombo.fund.token-fetcher.ts | 6 - .../gains-network.g-token.token-fetcher.ts | 38 - .../contracts/abis/gains-network-g-token.json | 1949 ++++++++++++--- .../gains-network/gains-network.module.ts | 2 - .../gains-network.g-token.token-fetcher.ts | 10 - .../contracts/abis/klima-distributor.json | 139 -- .../klima/contracts/abis/klima-s-klima.json | 303 --- .../klima/contracts/abis/klima-ws-klima.json | 158 -- .../klima/contracts/viem.contract-factory.ts | 16 +- .../klima/contracts/viem/KlimaDistributor.ts | 321 --- src/apps/klima/contracts/viem/KlimaSKlima.ts | 734 ------ src/apps/klima/contracts/viem/KlimaWsKlima.ts | 386 --- src/apps/klima/contracts/viem/index.ts | 6 - src/apps/klima/klima.module.ts | 4 - .../polygon/klima.s-klima.token-fetcher.ts | 120 - .../polygon/klima.ws-klima.token-fetcher.ts | 43 - .../lemma-finance/lemma-finance.module.ts | 2 - .../lemma-finance.x-usdl.token-fetcher.ts | 39 - .../llama-airforce-union-vault-pirex.json | 560 ----- .../abis/llama-airforce-union-vault.json | 494 ---- .../contracts/viem.contract-factory.ts | 12 +- .../contracts/viem/LlamaAirforceUnionVault.ts | 1069 --------- .../viem/LlamaAirforceUnionVaultPirex.ts | 1002 -------- .../llama-airforce/contracts/viem/index.ts | 4 - .../llama-airforce.vault.token-fetcher.ts | 79 - .../llama-airforce/llama-airforce.module.ts | 2 - src/apps/meshswap/assets/logo.png | Bin 13864 -> 0 bytes .../abis/meshswap-single-pool-factory.json | 569 ----- .../contracts/abis/meshswap-single-pool.json | 734 ------ src/apps/meshswap/contracts/index.ts | 4 - .../contracts/viem.contract-factory.ts | 20 - .../contracts/viem/MeshswapSinglePool.ts | 1357 ----------- .../viem/MeshswapSinglePoolFactory.ts | 994 -------- src/apps/meshswap/contracts/viem/index.ts | 9 - src/apps/meshswap/meshswap.module.ts | 18 - .../polygon/meshswap.pool.token-fetcher.ts | 8 - .../polygon/meshswap.supply.token-fetcher.ts | 72 - .../mux/arbitrum/mux.mux.token-fetcher.ts | 41 - src/apps/mux/mux.module.ts | 2 - .../contracts/abis/olympus-g-ohm-token.json | 269 --- .../contracts/abis/olympus-s-ohm-token.json | 303 --- .../abis/olympus-s-ohm-v-1-token.json | 303 --- .../abis/olympus-ws-ohm-v-1-token.json | 158 -- .../contracts/viem.contract-factory.ts | 16 - .../contracts/viem/OlympusGOhmToken.ts | 619 ----- .../contracts/viem/OlympusSOhmToken.ts | 723 ------ .../contracts/viem/OlympusSOhmV1Token.ts | 734 ------ .../contracts/viem/OlympusWsOhmV1Token.ts | 386 --- src/apps/olympus/contracts/viem/index.ts | 8 - .../ethereum/olympus.g-ohm.token-fetcher.ts | 79 - .../olympus.s-ohm-v1.token-fetcher.ts | 62 - .../ethereum/olympus.s-ohm.token-fetcher.ts | 62 - .../olympus.ws-ohm-v1.token-fetcher.ts | 42 - src/apps/olympus/olympus.module.ts | 8 - .../ooki/arbitrum/ooki.lend.token-fetcher.ts | 47 - src/apps/ooki/assets/logo.png | Bin 305833 -> 0 bytes .../ooki.lend.token-fetcher.ts | 47 - .../ooki/contracts/abis/ooki-i-token.json | 956 -------- .../contracts/abis/ooki-token-registry.json | 55 - src/apps/ooki/contracts/index.ts | 4 - .../ooki/contracts/viem.contract-factory.ts | 20 - src/apps/ooki/contracts/viem/OokiIToken.ts | 970 -------- .../ooki/contracts/viem/OokiTokenRegistry.ts | 69 - src/apps/ooki/contracts/viem/index.ts | 9 - .../ooki/ethereum/ooki.lend.token-fetcher.ts | 47 - src/apps/ooki/ooki.module.ts | 23 - .../ooki/optimism/ooki.lend.token-fetcher.ts | 47 - .../ooki/polygon/ooki.lend.token-fetcher.ts | 47 - .../arbitrum/plutus.plv-glp.token-fetcher.ts | 58 - src/apps/plutus/plutus.module.ts | 2 - .../contracts/abis/qi-dao-yield-token.json | 314 --- .../qi-dao/contracts/viem.contract-factory.ts | 4 - .../qi-dao/contracts/viem/QiDaoYieldToken.ts | 598 ----- src/apps/qi-dao/contracts/viem/index.ts | 2 - .../polygon/qi-dao.yield.token-fetcher.ts | 55 - src/apps/qi-dao/qi-dao.module.ts | 2 - ...igoblock.pool.contract-position-fetcher.ts | 11 - .../arbitrum/rigoblock.pool.token-fetcher.ts | 8 - src/apps/rigoblock/assets/logo.png | Bin 9031 -> 0 bytes .../common/rigoblock.log-provider.ts | 55 - ...igoblock.pool.contract-position-fetcher.ts | 149 -- .../common/rigoblock.pool.pool-builders.ts | 41 - .../common/rigoblock.pool.token-fetcher.ts | 200 -- .../rigoblock/contracts/abis/governance.json | 318 --- .../rigoblock/contracts/abis/grg-vault.json | 215 -- .../contracts/abis/pool-registry.json | 112 - .../rigoblock/contracts/abis/smart-pool.json | 407 ---- .../rigoblock/contracts/abis/staking.json | 659 ----- .../contracts/abis/token-whitelist.json | 54 - src/apps/rigoblock/contracts/index.ts | 4 - .../contracts/viem.contract-factory.ts | 39 - .../rigoblock/contracts/viem/Governance.ts | 696 ------ src/apps/rigoblock/contracts/viem/GrgVault.ts | 446 ---- .../rigoblock/contracts/viem/PoolRegistry.ts | 266 --- .../rigoblock/contracts/viem/SmartPool.ts | 903 ------- src/apps/rigoblock/contracts/viem/Staking.ts | 1455 ------------ .../contracts/viem/TokenWhitelist.ts | 122 - src/apps/rigoblock/contracts/viem/index.ts | 17 - ...igoblock.pool.contract-position-fetcher.ts | 11 - .../ethereum/rigoblock.pool.token-fetcher.ts | 8 - ...igoblock.pool.contract-position-fetcher.ts | 11 - .../optimism/rigoblock.pool.token-fetcher.ts | 8 - ...igoblock.pool.contract-position-fetcher.ts | 11 - .../polygon/rigoblock.pool.token-fetcher.ts | 8 - src/apps/rigoblock/rigoblock.module.ts | 34 - .../arbitrum/stargate.eth.token-fetcher.ts | 10 - .../base/stargate.eth.token-fetcher.ts | 10 - .../common/stargate.eth.token-fetcher.ts | 35 - .../stargate/contracts/abis/stargate-eth.json | 395 --- .../contracts/viem.contract-factory.ts | 4 - .../stargate/contracts/viem/StargateEth.ts | 409 ---- src/apps/stargate/contracts/viem/index.ts | 2 - .../ethereum/stargate.eth.token-fetcher.ts | 10 - .../optimism/stargate.eth.token-fetcher.ts | 10 - src/apps/stargate/stargate.module.ts | 8 - .../tarot/fantom/tarot.vault.token-fetcher.ts | 64 - src/apps/tarot/tarot.module.ts | 8 +- .../umami-finance.compound.token-fetcher.ts | 65 - .../umami-finance.glp-vaults.token-fetcher.ts | 92 - ...mi-finance.marinate-umami.token-fetcher.ts | 43 - ...nce.timelocked-glp-vaults.token-fetcher.ts | 72 - .../common/umami-finance.constants.ts | 15 - .../common/umami-finance.helpers.ts | 23 - .../abis/umami-finance-compound.json | 517 ---- .../abis/umami-finance-glp-vault.json | 931 -------- .../umami-finance-timelocked-glp-vault.json | 644 ----- .../contracts/viem.contract-factory.ts | 16 +- .../contracts/viem/UmamiFinanceCompound.ts | 1139 --------- .../contracts/viem/UmamiFinanceGlpVault.ts | 945 -------- .../viem/UmamiFinanceTimelockedGlpVault.ts | 1109 --------- .../umami-finance/contracts/viem/index.ts | 6 - .../umami-finance/umami-finance.module.ts | 13 +- .../abis/unlockd-finance-debt-token.json | 623 ----- ...-finance-lend-pool-addresses-provider.json | 903 ------- .../abis/unlockd-finance-lend-pool.json | 2100 ---------------- ...nlockd-finance-protocol-data-provider.json | 678 ------ .../abis/unlockd-finance-u-token.json | 661 ------ src/apps/unlockd-finance/contracts/index.ts | 4 - .../contracts/viem.contract-factory.ts | 41 - .../contracts/viem/UnlockdFinanceDebtToken.ts | 637 ----- .../contracts/viem/UnlockdFinanceLendPool.ts | 2114 ----------------- ...UnlockdFinanceLendPoolAddressesProvider.ts | 920 ------- .../UnlockdFinanceProtocolDataProvider.ts | 695 ------ .../contracts/viem/UnlockdFinanceUToken.ts | 675 ------ .../unlockd-finance/contracts/viem/index.ts | 15 - .../unlockd-finance.position-presenter.ts | 2 +- .../unlockd-finance.supply.token-fetcher.ts | 78 - ...ckd-finance.variable-debt.token-fetcher.ts | 84 - .../unlockd-finance/unlockd-finance.module.ts | 10 +- .../arbitrum/vela.es-vela.token-fetcher.ts | 9 - .../vela/common/vela.es-vela.token-fetcher.ts | 41 - src/apps/vela/vela.module.ts | 8 +- 238 files changed, 1685 insertions(+), 66339 deletions(-) delete mode 100644 src/apps/aave-safety-module/contracts/abis/aave-abpt.json delete mode 100644 src/apps/aave-safety-module/contracts/abis/aave-bpt.json delete mode 100644 src/apps/aave-safety-module/contracts/abis/aave-stk-apy-helper.json delete mode 100644 src/apps/aave-safety-module/contracts/viem/AaveAbpt.ts delete mode 100644 src/apps/aave-safety-module/contracts/viem/AaveBpt.ts delete mode 100644 src/apps/aave-safety-module/contracts/viem/AaveStkApyHelper.ts delete mode 100644 src/apps/aave-safety-module/ethereum/aave-safety-module.abpt.token-fetcher.ts delete mode 100644 src/apps/across/common/across.pool-v1.token-fetcher.ts delete mode 100644 src/apps/across/contracts/abis/across-pool-v-1.json delete mode 100644 src/apps/across/contracts/viem/AcrossPoolV1.ts delete mode 100644 src/apps/across/ethereum/across.pool-v1.token-fetcher.ts delete mode 100644 src/apps/alpha-v1/alpha-v1.module.ts delete mode 100644 src/apps/alpha-v1/assets/logo.png delete mode 100644 src/apps/alpha-v1/contracts/abis/alpha-bank.json delete mode 100644 src/apps/alpha-v1/contracts/index.ts delete mode 100644 src/apps/alpha-v1/contracts/viem.contract-factory.ts delete mode 100644 src/apps/alpha-v1/contracts/viem/AlphaBank.ts delete mode 100644 src/apps/alpha-v1/contracts/viem/index.ts delete mode 100644 src/apps/alpha-v1/ethereum/alpha-v1.lending.token-fetcher.ts delete mode 100644 src/apps/aura/contracts/abis/aura-bal-staking-token.json delete mode 100644 src/apps/aura/contracts/viem/AuraBalStakingToken.ts delete mode 100644 src/apps/aura/ethereum/aura.staked-aura-bal.token-fetcher.ts delete mode 100644 src/apps/balancer-v2/common/balancer-v2.static-yield.token-fetcher.ts delete mode 100644 src/apps/balancer-v2/contracts/abis/balancer-static-a-token.json delete mode 100644 src/apps/balancer-v2/contracts/abis/balancer-wrapped-aave-token.json delete mode 100644 src/apps/balancer-v2/contracts/viem/BalancerStaticAToken.ts delete mode 100644 src/apps/balancer-v2/contracts/viem/BalancerWrappedAaveToken.ts delete mode 100644 src/apps/balancer-v2/ethereum/balancer-v2.wrapped-aave.token-fetcher.ts delete mode 100644 src/apps/balancer-v2/polygon/balancer-v2.static-yield.token-fetcher.ts delete mode 100644 src/apps/bancor-v3/ethereum/bancor-v3.bnt-pool.token-fetcher.ts delete mode 100644 src/apps/concentrator/ethereum/concentrator.abc.token-fetcher.ts delete mode 100644 src/apps/concentrator/ethereum/concentrator.compounder.token-fetcher.ts delete mode 100644 src/apps/dfx/common/dfx.curve.token-fetcher.ts delete mode 100644 src/apps/dfx/ethereum/dfx.curve.token-fetcher.ts delete mode 100644 src/apps/dfx/polygon/dfx.curve.token-fetcher.ts delete mode 100644 src/apps/dinero/assets/0x04c154b66cb340f3ae24111cc767e0184ed00cc6.png delete mode 100644 src/apps/dinero/assets/0x9ba021b0a9b958b5e75ce9f6dff97c7ee52cb3e6.png delete mode 100644 src/apps/dinero/assets/logo.png delete mode 100644 src/apps/dinero/contracts/abis/dinero-apxeth.json delete mode 100644 src/apps/dinero/contracts/abis/dinero-pxeth.json delete mode 100644 src/apps/dinero/contracts/index.ts delete mode 100644 src/apps/dinero/contracts/viem.contract-factory.ts delete mode 100644 src/apps/dinero/contracts/viem/DineroApxeth.ts delete mode 100644 src/apps/dinero/contracts/viem/DineroPxeth.ts delete mode 100644 src/apps/dinero/contracts/viem/index.ts delete mode 100644 src/apps/dinero/dinero.module.ts delete mode 100644 src/apps/dinero/ethereum/dinero.apxeth.token-fetcher.ts delete mode 100644 src/apps/dinero/ethereum/dinero.pxeth.token-fetcher.ts delete mode 100644 src/apps/euler/assets/logo.png delete mode 100644 src/apps/euler/common/euler.api.staking-registry.ts delete mode 100644 src/apps/euler/common/euler.d-token.token-fetcher.ts delete mode 100644 src/apps/euler/common/euler.e-token.token-fetcher.ts delete mode 100644 src/apps/euler/common/euler.p-token.token-fetcher.ts delete mode 100644 src/apps/euler/common/euler.token-definition-resolver.ts delete mode 100644 src/apps/euler/contracts/abis/euler-dtoken-contract.json delete mode 100644 src/apps/euler/contracts/abis/euler-etoken-contract.json delete mode 100644 src/apps/euler/contracts/abis/euler-ptoken-contract.json delete mode 100644 src/apps/euler/contracts/abis/euler-staking-rewards-contract.json delete mode 100644 src/apps/euler/contracts/index.ts delete mode 100644 src/apps/euler/contracts/viem.contract-factory.ts delete mode 100644 src/apps/euler/contracts/viem/EulerDtokenContract.ts delete mode 100644 src/apps/euler/contracts/viem/EulerEtokenContract.ts delete mode 100644 src/apps/euler/contracts/viem/EulerPtokenContract.ts delete mode 100644 src/apps/euler/contracts/viem/EulerStakingRewardsContract.ts delete mode 100644 src/apps/euler/contracts/viem/index.ts delete mode 100644 src/apps/euler/ethereum/euler.d-token.token-fetcher.ts delete mode 100644 src/apps/euler/ethereum/euler.e-token.token-fetcher.ts delete mode 100644 src/apps/euler/ethereum/euler.p-token.token-fetcher.ts delete mode 100644 src/apps/euler/ethereum/euler.position-presenter.ts delete mode 100644 src/apps/euler/ethereum/euler.single-staking-farm.contract-position-fetcher.ts delete mode 100644 src/apps/euler/euler.module.ts delete mode 100644 src/apps/gains-network/common/gains-network.g-token.token-fetcher.ts delete mode 100644 src/apps/gains-network/polygon/gains-network.g-token.token-fetcher.ts delete mode 100644 src/apps/klima/contracts/abis/klima-distributor.json delete mode 100644 src/apps/klima/contracts/abis/klima-s-klima.json delete mode 100644 src/apps/klima/contracts/abis/klima-ws-klima.json delete mode 100644 src/apps/klima/contracts/viem/KlimaDistributor.ts delete mode 100644 src/apps/klima/contracts/viem/KlimaSKlima.ts delete mode 100644 src/apps/klima/contracts/viem/KlimaWsKlima.ts delete mode 100644 src/apps/klima/polygon/klima.s-klima.token-fetcher.ts delete mode 100644 src/apps/klima/polygon/klima.ws-klima.token-fetcher.ts delete mode 100644 src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts delete mode 100644 src/apps/llama-airforce/contracts/abis/llama-airforce-union-vault-pirex.json delete mode 100644 src/apps/llama-airforce/contracts/abis/llama-airforce-union-vault.json delete mode 100644 src/apps/llama-airforce/contracts/viem/LlamaAirforceUnionVault.ts delete mode 100644 src/apps/llama-airforce/contracts/viem/LlamaAirforceUnionVaultPirex.ts delete mode 100644 src/apps/llama-airforce/ethereum/llama-airforce.vault.token-fetcher.ts delete mode 100644 src/apps/meshswap/assets/logo.png delete mode 100644 src/apps/meshswap/contracts/abis/meshswap-single-pool-factory.json delete mode 100644 src/apps/meshswap/contracts/abis/meshswap-single-pool.json delete mode 100644 src/apps/meshswap/contracts/index.ts delete mode 100644 src/apps/meshswap/contracts/viem.contract-factory.ts delete mode 100644 src/apps/meshswap/contracts/viem/MeshswapSinglePool.ts delete mode 100644 src/apps/meshswap/contracts/viem/MeshswapSinglePoolFactory.ts delete mode 100644 src/apps/meshswap/contracts/viem/index.ts delete mode 100644 src/apps/meshswap/meshswap.module.ts delete mode 100644 src/apps/meshswap/polygon/meshswap.pool.token-fetcher.ts delete mode 100644 src/apps/meshswap/polygon/meshswap.supply.token-fetcher.ts delete mode 100644 src/apps/mux/arbitrum/mux.mux.token-fetcher.ts delete mode 100644 src/apps/olympus/contracts/abis/olympus-g-ohm-token.json delete mode 100644 src/apps/olympus/contracts/abis/olympus-s-ohm-token.json delete mode 100644 src/apps/olympus/contracts/abis/olympus-s-ohm-v-1-token.json delete mode 100644 src/apps/olympus/contracts/abis/olympus-ws-ohm-v-1-token.json delete mode 100644 src/apps/olympus/contracts/viem/OlympusGOhmToken.ts delete mode 100644 src/apps/olympus/contracts/viem/OlympusSOhmToken.ts delete mode 100644 src/apps/olympus/contracts/viem/OlympusSOhmV1Token.ts delete mode 100644 src/apps/olympus/contracts/viem/OlympusWsOhmV1Token.ts delete mode 100644 src/apps/olympus/ethereum/olympus.g-ohm.token-fetcher.ts delete mode 100644 src/apps/olympus/ethereum/olympus.s-ohm-v1.token-fetcher.ts delete mode 100644 src/apps/olympus/ethereum/olympus.s-ohm.token-fetcher.ts delete mode 100644 src/apps/olympus/ethereum/olympus.ws-ohm-v1.token-fetcher.ts delete mode 100644 src/apps/ooki/arbitrum/ooki.lend.token-fetcher.ts delete mode 100644 src/apps/ooki/assets/logo.png delete mode 100644 src/apps/ooki/binance-smart-chain/ooki.lend.token-fetcher.ts delete mode 100644 src/apps/ooki/contracts/abis/ooki-i-token.json delete mode 100644 src/apps/ooki/contracts/abis/ooki-token-registry.json delete mode 100644 src/apps/ooki/contracts/index.ts delete mode 100644 src/apps/ooki/contracts/viem.contract-factory.ts delete mode 100644 src/apps/ooki/contracts/viem/OokiIToken.ts delete mode 100644 src/apps/ooki/contracts/viem/OokiTokenRegistry.ts delete mode 100644 src/apps/ooki/contracts/viem/index.ts delete mode 100644 src/apps/ooki/ethereum/ooki.lend.token-fetcher.ts delete mode 100644 src/apps/ooki/ooki.module.ts delete mode 100644 src/apps/ooki/optimism/ooki.lend.token-fetcher.ts delete mode 100644 src/apps/ooki/polygon/ooki.lend.token-fetcher.ts delete mode 100644 src/apps/plutus/arbitrum/plutus.plv-glp.token-fetcher.ts delete mode 100644 src/apps/qi-dao/contracts/abis/qi-dao-yield-token.json delete mode 100644 src/apps/qi-dao/contracts/viem/QiDaoYieldToken.ts delete mode 100644 src/apps/qi-dao/polygon/qi-dao.yield.token-fetcher.ts delete mode 100644 src/apps/rigoblock/arbitrum/rigoblock.pool.contract-position-fetcher.ts delete mode 100644 src/apps/rigoblock/arbitrum/rigoblock.pool.token-fetcher.ts delete mode 100644 src/apps/rigoblock/assets/logo.png delete mode 100644 src/apps/rigoblock/common/rigoblock.log-provider.ts delete mode 100644 src/apps/rigoblock/common/rigoblock.pool.contract-position-fetcher.ts delete mode 100644 src/apps/rigoblock/common/rigoblock.pool.pool-builders.ts delete mode 100644 src/apps/rigoblock/common/rigoblock.pool.token-fetcher.ts delete mode 100644 src/apps/rigoblock/contracts/abis/governance.json delete mode 100644 src/apps/rigoblock/contracts/abis/grg-vault.json delete mode 100644 src/apps/rigoblock/contracts/abis/pool-registry.json delete mode 100644 src/apps/rigoblock/contracts/abis/smart-pool.json delete mode 100644 src/apps/rigoblock/contracts/abis/staking.json delete mode 100644 src/apps/rigoblock/contracts/abis/token-whitelist.json delete mode 100644 src/apps/rigoblock/contracts/index.ts delete mode 100644 src/apps/rigoblock/contracts/viem.contract-factory.ts delete mode 100644 src/apps/rigoblock/contracts/viem/Governance.ts delete mode 100644 src/apps/rigoblock/contracts/viem/GrgVault.ts delete mode 100644 src/apps/rigoblock/contracts/viem/PoolRegistry.ts delete mode 100644 src/apps/rigoblock/contracts/viem/SmartPool.ts delete mode 100644 src/apps/rigoblock/contracts/viem/Staking.ts delete mode 100644 src/apps/rigoblock/contracts/viem/TokenWhitelist.ts delete mode 100644 src/apps/rigoblock/contracts/viem/index.ts delete mode 100644 src/apps/rigoblock/ethereum/rigoblock.pool.contract-position-fetcher.ts delete mode 100644 src/apps/rigoblock/ethereum/rigoblock.pool.token-fetcher.ts delete mode 100644 src/apps/rigoblock/optimism/rigoblock.pool.contract-position-fetcher.ts delete mode 100644 src/apps/rigoblock/optimism/rigoblock.pool.token-fetcher.ts delete mode 100644 src/apps/rigoblock/polygon/rigoblock.pool.contract-position-fetcher.ts delete mode 100644 src/apps/rigoblock/polygon/rigoblock.pool.token-fetcher.ts delete mode 100644 src/apps/rigoblock/rigoblock.module.ts delete mode 100644 src/apps/stargate/arbitrum/stargate.eth.token-fetcher.ts delete mode 100644 src/apps/stargate/base/stargate.eth.token-fetcher.ts delete mode 100644 src/apps/stargate/common/stargate.eth.token-fetcher.ts delete mode 100644 src/apps/stargate/contracts/abis/stargate-eth.json delete mode 100644 src/apps/stargate/contracts/viem/StargateEth.ts delete mode 100644 src/apps/stargate/ethereum/stargate.eth.token-fetcher.ts delete mode 100644 src/apps/stargate/optimism/stargate.eth.token-fetcher.ts delete mode 100644 src/apps/tarot/fantom/tarot.vault.token-fetcher.ts delete mode 100644 src/apps/umami-finance/arbitrum/umami-finance.compound.token-fetcher.ts delete mode 100644 src/apps/umami-finance/arbitrum/umami-finance.glp-vaults.token-fetcher.ts delete mode 100644 src/apps/umami-finance/arbitrum/umami-finance.marinate-umami.token-fetcher.ts delete mode 100644 src/apps/umami-finance/arbitrum/umami-finance.timelocked-glp-vaults.token-fetcher.ts delete mode 100644 src/apps/umami-finance/common/umami-finance.constants.ts delete mode 100644 src/apps/umami-finance/common/umami-finance.helpers.ts delete mode 100644 src/apps/umami-finance/contracts/abis/umami-finance-compound.json delete mode 100644 src/apps/umami-finance/contracts/abis/umami-finance-glp-vault.json delete mode 100644 src/apps/umami-finance/contracts/abis/umami-finance-timelocked-glp-vault.json delete mode 100644 src/apps/umami-finance/contracts/viem/UmamiFinanceCompound.ts delete mode 100644 src/apps/umami-finance/contracts/viem/UmamiFinanceGlpVault.ts delete mode 100644 src/apps/umami-finance/contracts/viem/UmamiFinanceTimelockedGlpVault.ts delete mode 100644 src/apps/unlockd-finance/contracts/abis/unlockd-finance-debt-token.json delete mode 100644 src/apps/unlockd-finance/contracts/abis/unlockd-finance-lend-pool-addresses-provider.json delete mode 100644 src/apps/unlockd-finance/contracts/abis/unlockd-finance-lend-pool.json delete mode 100644 src/apps/unlockd-finance/contracts/abis/unlockd-finance-protocol-data-provider.json delete mode 100644 src/apps/unlockd-finance/contracts/abis/unlockd-finance-u-token.json delete mode 100644 src/apps/unlockd-finance/contracts/index.ts delete mode 100644 src/apps/unlockd-finance/contracts/viem.contract-factory.ts delete mode 100644 src/apps/unlockd-finance/contracts/viem/UnlockdFinanceDebtToken.ts delete mode 100644 src/apps/unlockd-finance/contracts/viem/UnlockdFinanceLendPool.ts delete mode 100644 src/apps/unlockd-finance/contracts/viem/UnlockdFinanceLendPoolAddressesProvider.ts delete mode 100644 src/apps/unlockd-finance/contracts/viem/UnlockdFinanceProtocolDataProvider.ts delete mode 100644 src/apps/unlockd-finance/contracts/viem/UnlockdFinanceUToken.ts delete mode 100644 src/apps/unlockd-finance/contracts/viem/index.ts delete mode 100644 src/apps/unlockd-finance/ethereum/unlockd-finance.supply.token-fetcher.ts delete mode 100644 src/apps/unlockd-finance/ethereum/unlockd-finance.variable-debt.token-fetcher.ts delete mode 100644 src/apps/vela/arbitrum/vela.es-vela.token-fetcher.ts delete mode 100644 src/apps/vela/common/vela.es-vela.token-fetcher.ts diff --git a/src/apps/aave-safety-module/aave-safety-module.module.ts b/src/apps/aave-safety-module/aave-safety-module.module.ts index 6290dfa27..c887380b8 100644 --- a/src/apps/aave-safety-module/aave-safety-module.module.ts +++ b/src/apps/aave-safety-module/aave-safety-module.module.ts @@ -3,14 +3,12 @@ import { Module } from '@nestjs/common'; import { AbstractApp } from '~app/app.dynamic-module'; import { AaveSafetyModuleViemContractFactory } from './contracts'; -import { EthereumAaveSafetyModuleAbptTokenFetcher } from './ethereum/aave-safety-module.abpt.token-fetcher'; import { EthereumAaveSafetyModuleStkAaveClaimableContractPositionFetcher } from './ethereum/aave-safety-module.stk-aave-claimable.contract-position-fetcher'; import { EthereumAaveSafetyModuleStkAbptClaimableContractPositionFetcher } from './ethereum/aave-safety-module.stk-abpt-claimable.contract-position-fetcher'; @Module({ providers: [ AaveSafetyModuleViemContractFactory, - EthereumAaveSafetyModuleAbptTokenFetcher, EthereumAaveSafetyModuleStkAaveClaimableContractPositionFetcher, EthereumAaveSafetyModuleStkAbptClaimableContractPositionFetcher, ], diff --git a/src/apps/aave-safety-module/contracts/abis/aave-abpt.json b/src/apps/aave-safety-module/contracts/abis/aave-abpt.json deleted file mode 100644 index 7e9c0f536..000000000 --- a/src/apps/aave-safety-module/contracts/abis/aave-abpt.json +++ /dev/null @@ -1,574 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "oldCap", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "newCap", "type": "uint256" } - ], - "name": "CapChanged", - "type": "event" - }, - { - "anonymous": true, - "inputs": [ - { "indexed": true, "internalType": "bytes4", "name": "sig", "type": "bytes4" }, - { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, - { "indexed": false, "internalType": "bytes", "name": "data", "type": "bytes" } - ], - "name": "LogCall", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "tokenOut", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" } - ], - "name": "LogExit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "tokenIn", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" } - ], - "name": "LogJoin", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "token", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "pool", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "caller", "type": "address" } - ], - "name": "NewTokenCommitted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [], - "name": "DECIMALS", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEFAULT_ADD_TOKEN_TIME_LOCK_IN_BLOCKS", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEFAULT_MIN_WEIGHT_CHANGE_BLOCK_PERIOD", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "NAME", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "REVISION", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "addTokenTimeLockInBlocks", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { "inputs": [], "name": "applyAddToken", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "bFactory", - "outputs": [{ "internalType": "contract IBFactory", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "bPool", - "outputs": [{ "internalType": "contract IBPool", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "bspCap", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "burnPoolShareFromLib", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "provider", "type": "address" }], - "name": "canProvideLiquidity", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "token", "type": "address" }, - { "internalType": "uint256", "name": "balance", "type": "uint256" }, - { "internalType": "uint256", "name": "denormalizedWeight", "type": "uint256" } - ], - "name": "commitAddToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "initialSupply", "type": "uint256" }], - "name": "createPool", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "initialSupply", "type": "uint256" }, - { "internalType": "uint256", "name": "minimumWeightChangeBlockPeriodParam", "type": "uint256" }, - { "internalType": "uint256", "name": "addTokenTimeLockInBlocksParam", "type": "uint256" } - ], - "name": "createPool", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "decreaseApproval", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "poolAmountIn", "type": "uint256" }, - { "internalType": "uint256[]", "name": "minAmountsOut", "type": "uint256[]" } - ], - "name": "exitPool", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "tokenOut", "type": "address" }, - { "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" }, - { "internalType": "uint256", "name": "maxPoolAmountIn", "type": "uint256" } - ], - "name": "exitswapExternAmountOut", - "outputs": [{ "internalType": "uint256", "name": "poolAmountIn", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "tokenOut", "type": "address" }, - { "internalType": "uint256", "name": "poolAmountIn", "type": "uint256" }, - { "internalType": "uint256", "name": "minAmountOut", "type": "uint256" } - ], - "name": "exitswapPoolAmountIn", - "outputs": [{ "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getBalancerSafeMathVersion", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "getController", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "token", "type": "address" }], - "name": "getDenormalizedWeight", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getRightsManagerVersion", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "getSmartPoolManagerVersion", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "gradualUpdate", - "outputs": [ - { "internalType": "uint256", "name": "startBlock", "type": "uint256" }, - { "internalType": "uint256", "name": "endBlock", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "enum RightsManager.Permissions", "name": "permission", "type": "uint8" }], - "name": "hasPermission", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "increaseApproval", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "factoryAddress", "type": "address" }, - { - "components": [ - { "internalType": "string", "name": "poolTokenSymbol", "type": "string" }, - { "internalType": "string", "name": "poolTokenName", "type": "string" }, - { "internalType": "address[]", "name": "constituentTokens", "type": "address[]" }, - { "internalType": "uint256[]", "name": "tokenBalances", "type": "uint256[]" }, - { "internalType": "uint256[]", "name": "tokenWeights", "type": "uint256[]" }, - { "internalType": "uint256", "name": "swapFee", "type": "uint256" } - ], - "internalType": "struct ConfigurableRightsPool.PoolParams", - "name": "poolParams", - "type": "tuple" - }, - { - "components": [ - { "internalType": "bool", "name": "canPauseSwapping", "type": "bool" }, - { "internalType": "bool", "name": "canChangeSwapFee", "type": "bool" }, - { "internalType": "bool", "name": "canChangeWeights", "type": "bool" }, - { "internalType": "bool", "name": "canAddRemoveTokens", "type": "bool" }, - { "internalType": "bool", "name": "canWhitelistLPs", "type": "bool" }, - { "internalType": "bool", "name": "canChangeCap", "type": "bool" } - ], - "internalType": "struct RightsManager.Rights", - "name": "rightsStruct", - "type": "tuple" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "isPublicSwap", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "poolAmountOut", "type": "uint256" }, - { "internalType": "uint256[]", "name": "maxAmountsIn", "type": "uint256[]" } - ], - "name": "joinPool", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "tokenIn", "type": "address" }, - { "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" }, - { "internalType": "uint256", "name": "minPoolAmountOut", "type": "uint256" } - ], - "name": "joinswapExternAmountIn", - "outputs": [{ "internalType": "uint256", "name": "poolAmountOut", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "tokenIn", "type": "address" }, - { "internalType": "uint256", "name": "poolAmountOut", "type": "uint256" }, - { "internalType": "uint256", "name": "maxAmountIn", "type": "uint256" } - ], - "name": "joinswapPoolAmountOut", - "outputs": [{ "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "minimumWeightChangeBlockPeriod", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "mintPoolShareFromLib", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "newToken", - "outputs": [ - { "internalType": "address", "name": "addr", "type": "address" }, - { "internalType": "bool", "name": "isCommitted", "type": "bool" }, - { "internalType": "uint256", "name": "commitBlock", "type": "uint256" }, - { "internalType": "uint256", "name": "denorm", "type": "uint256" }, - { "internalType": "uint256", "name": "balance", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function" - }, - { "inputs": [], "name": "pokeWeights", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "pullPoolShareFromLib", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "pushPoolShareFromLib", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "token", "type": "address" }], - "name": "removeToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "provider", "type": "address" }], - "name": "removeWhitelistedLiquidityProvider", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rights", - "outputs": [ - { "internalType": "bool", "name": "canPauseSwapping", "type": "bool" }, - { "internalType": "bool", "name": "canChangeSwapFee", "type": "bool" }, - { "internalType": "bool", "name": "canChangeWeights", "type": "bool" }, - { "internalType": "bool", "name": "canAddRemoveTokens", "type": "bool" }, - { "internalType": "bool", "name": "canWhitelistLPs", "type": "bool" }, - { "internalType": "bool", "name": "canChangeCap", "type": "bool" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "newCap", "type": "uint256" }], - "name": "setCap", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], - "name": "setController", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "bool", "name": "publicSwap", "type": "bool" }], - "name": "setPublicSwap", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "swapFee", "type": "uint256" }], - "name": "setSwapFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "token", "type": "address" }, - { "internalType": "uint256", "name": "newWeight", "type": "uint256" } - ], - "name": "updateWeight", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256[]", "name": "newWeights", "type": "uint256[]" }, - { "internalType": "uint256", "name": "startBlock", "type": "uint256" }, - { "internalType": "uint256", "name": "endBlock", "type": "uint256" } - ], - "name": "updateWeightsGradually", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "provider", "type": "address" }], - "name": "whitelistLiquidityProvider", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/aave-safety-module/contracts/abis/aave-bpt.json b/src/apps/aave-safety-module/contracts/abis/aave-bpt.json deleted file mode 100644 index ad2c86d2b..000000000 --- a/src/apps/aave-safety-module/contracts/abis/aave-bpt.json +++ /dev/null @@ -1,771 +0,0 @@ -[ - { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "src", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "dst", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amt", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": true, - "inputs": [ - { "indexed": true, "internalType": "bytes4", "name": "sig", "type": "bytes4" }, - { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, - { "indexed": false, "internalType": "bytes", "name": "data", "type": "bytes" } - ], - "name": "LOG_CALL", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "tokenOut", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" } - ], - "name": "LOG_EXIT", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "tokenIn", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" } - ], - "name": "LOG_JOIN", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "caller", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "tokenIn", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "tokenOut", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" } - ], - "name": "LOG_SWAP", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "src", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "dst", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amt", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "constant": true, - "inputs": [], - "name": "BONE", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "BPOW_PRECISION", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "EXIT_FEE", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "INIT_POOL_SUPPLY", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "MAX_BOUND_TOKENS", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "MAX_BPOW_BASE", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "MAX_FEE", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "MAX_IN_RATIO", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "MAX_OUT_RATIO", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "MAX_TOTAL_WEIGHT", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "MAX_WEIGHT", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "MIN_BALANCE", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "MIN_BOUND_TOKENS", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "MIN_BPOW_BASE", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "MIN_FEE", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "MIN_WEIGHT", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "internalType": "address", "name": "src", "type": "address" }, - { "internalType": "address", "name": "dst", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "dst", "type": "address" }, - { "internalType": "uint256", "name": "amt", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "internalType": "address", "name": "whom", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "token", "type": "address" }, - { "internalType": "uint256", "name": "balance", "type": "uint256" }, - { "internalType": "uint256", "name": "denorm", "type": "uint256" } - ], - "name": "bind", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "internalType": "uint256", "name": "tokenBalanceIn", "type": "uint256" }, - { "internalType": "uint256", "name": "tokenWeightIn", "type": "uint256" }, - { "internalType": "uint256", "name": "tokenBalanceOut", "type": "uint256" }, - { "internalType": "uint256", "name": "tokenWeightOut", "type": "uint256" }, - { "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" }, - { "internalType": "uint256", "name": "swapFee", "type": "uint256" } - ], - "name": "calcInGivenOut", - "outputs": [{ "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" }], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "internalType": "uint256", "name": "tokenBalanceIn", "type": "uint256" }, - { "internalType": "uint256", "name": "tokenWeightIn", "type": "uint256" }, - { "internalType": "uint256", "name": "tokenBalanceOut", "type": "uint256" }, - { "internalType": "uint256", "name": "tokenWeightOut", "type": "uint256" }, - { "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" }, - { "internalType": "uint256", "name": "swapFee", "type": "uint256" } - ], - "name": "calcOutGivenIn", - "outputs": [{ "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" }], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "internalType": "uint256", "name": "tokenBalanceOut", "type": "uint256" }, - { "internalType": "uint256", "name": "tokenWeightOut", "type": "uint256" }, - { "internalType": "uint256", "name": "poolSupply", "type": "uint256" }, - { "internalType": "uint256", "name": "totalWeight", "type": "uint256" }, - { "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" }, - { "internalType": "uint256", "name": "swapFee", "type": "uint256" } - ], - "name": "calcPoolInGivenSingleOut", - "outputs": [{ "internalType": "uint256", "name": "poolAmountIn", "type": "uint256" }], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "internalType": "uint256", "name": "tokenBalanceIn", "type": "uint256" }, - { "internalType": "uint256", "name": "tokenWeightIn", "type": "uint256" }, - { "internalType": "uint256", "name": "poolSupply", "type": "uint256" }, - { "internalType": "uint256", "name": "totalWeight", "type": "uint256" }, - { "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" }, - { "internalType": "uint256", "name": "swapFee", "type": "uint256" } - ], - "name": "calcPoolOutGivenSingleIn", - "outputs": [{ "internalType": "uint256", "name": "poolAmountOut", "type": "uint256" }], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "internalType": "uint256", "name": "tokenBalanceIn", "type": "uint256" }, - { "internalType": "uint256", "name": "tokenWeightIn", "type": "uint256" }, - { "internalType": "uint256", "name": "poolSupply", "type": "uint256" }, - { "internalType": "uint256", "name": "totalWeight", "type": "uint256" }, - { "internalType": "uint256", "name": "poolAmountOut", "type": "uint256" }, - { "internalType": "uint256", "name": "swapFee", "type": "uint256" } - ], - "name": "calcSingleInGivenPoolOut", - "outputs": [{ "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" }], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "internalType": "uint256", "name": "tokenBalanceOut", "type": "uint256" }, - { "internalType": "uint256", "name": "tokenWeightOut", "type": "uint256" }, - { "internalType": "uint256", "name": "poolSupply", "type": "uint256" }, - { "internalType": "uint256", "name": "totalWeight", "type": "uint256" }, - { "internalType": "uint256", "name": "poolAmountIn", "type": "uint256" }, - { "internalType": "uint256", "name": "swapFee", "type": "uint256" } - ], - "name": "calcSingleOutGivenPoolIn", - "outputs": [{ "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" }], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "internalType": "uint256", "name": "tokenBalanceIn", "type": "uint256" }, - { "internalType": "uint256", "name": "tokenWeightIn", "type": "uint256" }, - { "internalType": "uint256", "name": "tokenBalanceOut", "type": "uint256" }, - { "internalType": "uint256", "name": "tokenWeightOut", "type": "uint256" }, - { "internalType": "uint256", "name": "swapFee", "type": "uint256" } - ], - "name": "calcSpotPrice", - "outputs": [{ "internalType": "uint256", "name": "spotPrice", "type": "uint256" }], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "dst", "type": "address" }, - { "internalType": "uint256", "name": "amt", "type": "uint256" } - ], - "name": "decreaseApproval", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "uint256", "name": "poolAmountIn", "type": "uint256" }, - { "internalType": "uint256[]", "name": "minAmountsOut", "type": "uint256[]" } - ], - "name": "exitPool", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "tokenOut", "type": "address" }, - { "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" }, - { "internalType": "uint256", "name": "maxPoolAmountIn", "type": "uint256" } - ], - "name": "exitswapExternAmountOut", - "outputs": [{ "internalType": "uint256", "name": "poolAmountIn", "type": "uint256" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "tokenOut", "type": "address" }, - { "internalType": "uint256", "name": "poolAmountIn", "type": "uint256" }, - { "internalType": "uint256", "name": "minAmountOut", "type": "uint256" } - ], - "name": "exitswapPoolAmountIn", - "outputs": [{ "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "finalize", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "internalType": "address", "name": "token", "type": "address" }], - "name": "getBalance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getColor", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getController", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getCurrentTokens", - "outputs": [{ "internalType": "address[]", "name": "tokens", "type": "address[]" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "internalType": "address", "name": "token", "type": "address" }], - "name": "getDenormalizedWeight", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getFinalTokens", - "outputs": [{ "internalType": "address[]", "name": "tokens", "type": "address[]" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "internalType": "address", "name": "token", "type": "address" }], - "name": "getNormalizedWeight", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getNumTokens", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "internalType": "address", "name": "tokenIn", "type": "address" }, - { "internalType": "address", "name": "tokenOut", "type": "address" } - ], - "name": "getSpotPrice", - "outputs": [{ "internalType": "uint256", "name": "spotPrice", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "internalType": "address", "name": "tokenIn", "type": "address" }, - { "internalType": "address", "name": "tokenOut", "type": "address" } - ], - "name": "getSpotPriceSansFee", - "outputs": [{ "internalType": "uint256", "name": "spotPrice", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getSwapFee", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getTotalDenormalizedWeight", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "internalType": "address", "name": "token", "type": "address" }], - "name": "gulp", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "dst", "type": "address" }, - { "internalType": "uint256", "name": "amt", "type": "uint256" } - ], - "name": "increaseApproval", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "internalType": "address", "name": "t", "type": "address" }], - "name": "isBound", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "isFinalized", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "isPublicSwap", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "uint256", "name": "poolAmountOut", "type": "uint256" }, - { "internalType": "uint256[]", "name": "maxAmountsIn", "type": "uint256[]" } - ], - "name": "joinPool", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "tokenIn", "type": "address" }, - { "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" }, - { "internalType": "uint256", "name": "minPoolAmountOut", "type": "uint256" } - ], - "name": "joinswapExternAmountIn", - "outputs": [{ "internalType": "uint256", "name": "poolAmountOut", "type": "uint256" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "tokenIn", "type": "address" }, - { "internalType": "uint256", "name": "poolAmountOut", "type": "uint256" }, - { "internalType": "uint256", "name": "maxAmountIn", "type": "uint256" } - ], - "name": "joinswapPoolAmountOut", - "outputs": [{ "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "token", "type": "address" }, - { "internalType": "uint256", "name": "balance", "type": "uint256" }, - { "internalType": "uint256", "name": "denorm", "type": "uint256" } - ], - "name": "rebind", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "internalType": "address", "name": "manager", "type": "address" }], - "name": "setController", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "internalType": "bool", "name": "public_", "type": "bool" }], - "name": "setPublicSwap", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "internalType": "uint256", "name": "swapFee", "type": "uint256" }], - "name": "setSwapFee", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "tokenIn", "type": "address" }, - { "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" }, - { "internalType": "address", "name": "tokenOut", "type": "address" }, - { "internalType": "uint256", "name": "minAmountOut", "type": "uint256" }, - { "internalType": "uint256", "name": "maxPrice", "type": "uint256" } - ], - "name": "swapExactAmountIn", - "outputs": [ - { "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" }, - { "internalType": "uint256", "name": "spotPriceAfter", "type": "uint256" } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "tokenIn", "type": "address" }, - { "internalType": "uint256", "name": "maxAmountIn", "type": "uint256" }, - { "internalType": "address", "name": "tokenOut", "type": "address" }, - { "internalType": "uint256", "name": "tokenAmountOut", "type": "uint256" }, - { "internalType": "uint256", "name": "maxPrice", "type": "uint256" } - ], - "name": "swapExactAmountOut", - "outputs": [ - { "internalType": "uint256", "name": "tokenAmountIn", "type": "uint256" }, - { "internalType": "uint256", "name": "spotPriceAfter", "type": "uint256" } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "dst", "type": "address" }, - { "internalType": "uint256", "name": "amt", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "src", "type": "address" }, - { "internalType": "address", "name": "dst", "type": "address" }, - { "internalType": "uint256", "name": "amt", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "internalType": "address", "name": "token", "type": "address" }], - "name": "unbind", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/aave-safety-module/contracts/abis/aave-stk-apy-helper.json b/src/apps/aave-safety-module/contracts/abis/aave-stk-apy-helper.json deleted file mode 100644 index 2069cb2b8..000000000 --- a/src/apps/aave-safety-module/contracts/abis/aave-stk-apy-helper.json +++ /dev/null @@ -1,161 +0,0 @@ -[ - { - "inputs": [ - { "internalType": "contract IPriceOracle", "name": "priceOracle", "type": "address" }, - { "internalType": "contract BPTPriceFeedI", "name": "bptPriceFeed", "type": "address" }, - { "internalType": "address", "name": "aave", "type": "address" }, - { "internalType": "contract IStakedToken", "name": "stkAave", "type": "address" }, - { "internalType": "address", "name": "bpt", "type": "address" }, - { "internalType": "contract IStakedToken", "name": "stkBpt", "type": "address" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "AAVE", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "BPT", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "BPT_PRICE_FEED", - "outputs": [{ "internalType": "contract BPTPriceFeedI", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PRICE_ORACLE", - "outputs": [{ "internalType": "contract IPriceOracle", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "STAKED_AAVE", - "outputs": [{ "internalType": "contract IStakedToken", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "STAKED_BPT", - "outputs": [{ "internalType": "contract IStakedToken", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "user", "type": "address" }], - "name": "getStkAaveData", - "outputs": [ - { - "components": [ - { "internalType": "uint256", "name": "stakeTokenTotalSupply", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeCooldownSeconds", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeUnstakeWindow", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeTokenPriceEth", "type": "uint256" }, - { "internalType": "uint256", "name": "rewardTokenPriceEth", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeApy", "type": "uint256" }, - { "internalType": "uint128", "name": "distributionPerSecond", "type": "uint128" }, - { "internalType": "uint256", "name": "distributionEnd", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeTokenUserBalance", "type": "uint256" }, - { "internalType": "uint256", "name": "underlyingTokenUserBalance", "type": "uint256" }, - { "internalType": "uint256", "name": "userCooldown", "type": "uint256" }, - { "internalType": "uint256", "name": "userIncentivesToClaim", "type": "uint256" }, - { "internalType": "uint256", "name": "userPermitNonce", "type": "uint256" } - ], - "internalType": "struct StakeUIHelperI.AssetUIData", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "user", "type": "address" }], - "name": "getStkBptData", - "outputs": [ - { - "components": [ - { "internalType": "uint256", "name": "stakeTokenTotalSupply", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeCooldownSeconds", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeUnstakeWindow", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeTokenPriceEth", "type": "uint256" }, - { "internalType": "uint256", "name": "rewardTokenPriceEth", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeApy", "type": "uint256" }, - { "internalType": "uint128", "name": "distributionPerSecond", "type": "uint128" }, - { "internalType": "uint256", "name": "distributionEnd", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeTokenUserBalance", "type": "uint256" }, - { "internalType": "uint256", "name": "underlyingTokenUserBalance", "type": "uint256" }, - { "internalType": "uint256", "name": "userCooldown", "type": "uint256" }, - { "internalType": "uint256", "name": "userIncentivesToClaim", "type": "uint256" }, - { "internalType": "uint256", "name": "userPermitNonce", "type": "uint256" } - ], - "internalType": "struct StakeUIHelperI.AssetUIData", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "user", "type": "address" }], - "name": "getUserUIData", - "outputs": [ - { - "components": [ - { "internalType": "uint256", "name": "stakeTokenTotalSupply", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeCooldownSeconds", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeUnstakeWindow", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeTokenPriceEth", "type": "uint256" }, - { "internalType": "uint256", "name": "rewardTokenPriceEth", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeApy", "type": "uint256" }, - { "internalType": "uint128", "name": "distributionPerSecond", "type": "uint128" }, - { "internalType": "uint256", "name": "distributionEnd", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeTokenUserBalance", "type": "uint256" }, - { "internalType": "uint256", "name": "underlyingTokenUserBalance", "type": "uint256" }, - { "internalType": "uint256", "name": "userCooldown", "type": "uint256" }, - { "internalType": "uint256", "name": "userIncentivesToClaim", "type": "uint256" }, - { "internalType": "uint256", "name": "userPermitNonce", "type": "uint256" } - ], - "internalType": "struct StakeUIHelperI.AssetUIData", - "name": "", - "type": "tuple" - }, - { - "components": [ - { "internalType": "uint256", "name": "stakeTokenTotalSupply", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeCooldownSeconds", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeUnstakeWindow", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeTokenPriceEth", "type": "uint256" }, - { "internalType": "uint256", "name": "rewardTokenPriceEth", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeApy", "type": "uint256" }, - { "internalType": "uint128", "name": "distributionPerSecond", "type": "uint128" }, - { "internalType": "uint256", "name": "distributionEnd", "type": "uint256" }, - { "internalType": "uint256", "name": "stakeTokenUserBalance", "type": "uint256" }, - { "internalType": "uint256", "name": "underlyingTokenUserBalance", "type": "uint256" }, - { "internalType": "uint256", "name": "userCooldown", "type": "uint256" }, - { "internalType": "uint256", "name": "userIncentivesToClaim", "type": "uint256" }, - { "internalType": "uint256", "name": "userPermitNonce", "type": "uint256" } - ], - "internalType": "struct StakeUIHelperI.AssetUIData", - "name": "", - "type": "tuple" - }, - { "internalType": "uint256", "name": "", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function" - } -] diff --git a/src/apps/aave-safety-module/contracts/viem.contract-factory.ts b/src/apps/aave-safety-module/contracts/viem.contract-factory.ts index ed7200c4f..b5a223b3c 100644 --- a/src/apps/aave-safety-module/contracts/viem.contract-factory.ts +++ b/src/apps/aave-safety-module/contracts/viem.contract-factory.ts @@ -3,13 +3,7 @@ import { Injectable, Inject } from '@nestjs/common'; import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; import { Network } from '~types/network.interface'; -import { - AaveAbpt__factory, - AaveBpt__factory, - AaveStkAave__factory, - AaveStkAbpt__factory, - AaveStkApyHelper__factory, -} from './viem'; +import { AaveStkAave__factory, AaveStkAbpt__factory } from './viem'; type ContractOpts = { address: string; network: Network }; @@ -17,19 +11,10 @@ type ContractOpts = { address: string; network: Network }; export class AaveSafetyModuleViemContractFactory { constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) {} - aaveAbpt({ address, network }: ContractOpts) { - return AaveAbpt__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - aaveBpt({ address, network }: ContractOpts) { - return AaveBpt__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } aaveStkAave({ address, network }: ContractOpts) { return AaveStkAave__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } aaveStkAbpt({ address, network }: ContractOpts) { return AaveStkAbpt__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } - aaveStkApyHelper({ address, network }: ContractOpts) { - return AaveStkApyHelper__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } } diff --git a/src/apps/aave-safety-module/contracts/viem/AaveAbpt.ts b/src/apps/aave-safety-module/contracts/viem/AaveAbpt.ts deleted file mode 100644 index 79ce7aa2a..000000000 --- a/src/apps/aave-safety-module/contracts/viem/AaveAbpt.ts +++ /dev/null @@ -1,1277 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const aaveAbptAbi = [ - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'oldCap', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'newCap', - type: 'uint256', - }, - ], - name: 'CapChanged', - type: 'event', - }, - { - anonymous: true, - inputs: [ - { - indexed: true, - internalType: 'bytes4', - name: 'sig', - type: 'bytes4', - }, - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - indexed: false, - internalType: 'bytes', - name: 'data', - type: 'bytes', - }, - ], - name: 'LogCall', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'tokenOut', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'tokenAmountOut', - type: 'uint256', - }, - ], - name: 'LogExit', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'tokenIn', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'tokenAmountIn', - type: 'uint256', - }, - ], - name: 'LogJoin', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'token', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'pool', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - ], - name: 'NewTokenCommitted', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'previousOwner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnershipTransferred', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - inputs: [], - name: 'DECIMALS', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'DEFAULT_ADD_TOKEN_TIME_LOCK_IN_BLOCKS', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'DEFAULT_MIN_WEIGHT_CHANGE_BLOCK_PERIOD', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'NAME', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'REVISION', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'addTokenTimeLockInBlocks', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'applyAddToken', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'bFactory', - outputs: [ - { - internalType: 'contract IBFactory', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'bPool', - outputs: [ - { - internalType: 'contract IBPool', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'bspCap', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'burnPoolShareFromLib', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'provider', - type: 'address', - }, - ], - name: 'canProvideLiquidity', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - { - internalType: 'uint256', - name: 'balance', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'denormalizedWeight', - type: 'uint256', - }, - ], - name: 'commitAddToken', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'initialSupply', - type: 'uint256', - }, - ], - name: 'createPool', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'initialSupply', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'minimumWeightChangeBlockPeriodParam', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'addTokenTimeLockInBlocksParam', - type: 'uint256', - }, - ], - name: 'createPool', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'pure', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'decreaseApproval', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'poolAmountIn', - type: 'uint256', - }, - { - internalType: 'uint256[]', - name: 'minAmountsOut', - type: 'uint256[]', - }, - ], - name: 'exitPool', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'tokenOut', - type: 'address', - }, - { - internalType: 'uint256', - name: 'tokenAmountOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'maxPoolAmountIn', - type: 'uint256', - }, - ], - name: 'exitswapExternAmountOut', - outputs: [ - { - internalType: 'uint256', - name: 'poolAmountIn', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'tokenOut', - type: 'address', - }, - { - internalType: 'uint256', - name: 'poolAmountIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'minAmountOut', - type: 'uint256', - }, - ], - name: 'exitswapPoolAmountIn', - outputs: [ - { - internalType: 'uint256', - name: 'tokenAmountOut', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'getBalancerSafeMathVersion', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'pure', - type: 'function', - }, - { - inputs: [], - name: 'getController', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - ], - name: 'getDenormalizedWeight', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getRightsManagerVersion', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'pure', - type: 'function', - }, - { - inputs: [], - name: 'getSmartPoolManagerVersion', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'pure', - type: 'function', - }, - { - inputs: [], - name: 'gradualUpdate', - outputs: [ - { - internalType: 'uint256', - name: 'startBlock', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'endBlock', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'enum RightsManager.Permissions', - name: 'permission', - type: 'uint8', - }, - ], - name: 'hasPermission', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'increaseApproval', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'factoryAddress', - type: 'address', - }, - { - components: [ - { - internalType: 'string', - name: 'poolTokenSymbol', - type: 'string', - }, - { - internalType: 'string', - name: 'poolTokenName', - type: 'string', - }, - { - internalType: 'address[]', - name: 'constituentTokens', - type: 'address[]', - }, - { - internalType: 'uint256[]', - name: 'tokenBalances', - type: 'uint256[]', - }, - { - internalType: 'uint256[]', - name: 'tokenWeights', - type: 'uint256[]', - }, - { - internalType: 'uint256', - name: 'swapFee', - type: 'uint256', - }, - ], - internalType: 'struct ConfigurableRightsPool.PoolParams', - name: 'poolParams', - type: 'tuple', - }, - { - components: [ - { - internalType: 'bool', - name: 'canPauseSwapping', - type: 'bool', - }, - { - internalType: 'bool', - name: 'canChangeSwapFee', - type: 'bool', - }, - { - internalType: 'bool', - name: 'canChangeWeights', - type: 'bool', - }, - { - internalType: 'bool', - name: 'canAddRemoveTokens', - type: 'bool', - }, - { - internalType: 'bool', - name: 'canWhitelistLPs', - type: 'bool', - }, - { - internalType: 'bool', - name: 'canChangeCap', - type: 'bool', - }, - ], - internalType: 'struct RightsManager.Rights', - name: 'rightsStruct', - type: 'tuple', - }, - ], - name: 'initialize', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'isPublicSwap', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'poolAmountOut', - type: 'uint256', - }, - { - internalType: 'uint256[]', - name: 'maxAmountsIn', - type: 'uint256[]', - }, - ], - name: 'joinPool', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'tokenIn', - type: 'address', - }, - { - internalType: 'uint256', - name: 'tokenAmountIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'minPoolAmountOut', - type: 'uint256', - }, - ], - name: 'joinswapExternAmountIn', - outputs: [ - { - internalType: 'uint256', - name: 'poolAmountOut', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'tokenIn', - type: 'address', - }, - { - internalType: 'uint256', - name: 'poolAmountOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'maxAmountIn', - type: 'uint256', - }, - ], - name: 'joinswapPoolAmountOut', - outputs: [ - { - internalType: 'uint256', - name: 'tokenAmountIn', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'minimumWeightChangeBlockPeriod', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'mintPoolShareFromLib', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'newToken', - outputs: [ - { - internalType: 'address', - name: 'addr', - type: 'address', - }, - { - internalType: 'bool', - name: 'isCommitted', - type: 'bool', - }, - { - internalType: 'uint256', - name: 'commitBlock', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'denorm', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'balance', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'pokeWeights', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'pullPoolShareFromLib', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'pushPoolShareFromLib', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - ], - name: 'removeToken', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'provider', - type: 'address', - }, - ], - name: 'removeWhitelistedLiquidityProvider', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'rights', - outputs: [ - { - internalType: 'bool', - name: 'canPauseSwapping', - type: 'bool', - }, - { - internalType: 'bool', - name: 'canChangeSwapFee', - type: 'bool', - }, - { - internalType: 'bool', - name: 'canChangeWeights', - type: 'bool', - }, - { - internalType: 'bool', - name: 'canAddRemoveTokens', - type: 'bool', - }, - { - internalType: 'bool', - name: 'canWhitelistLPs', - type: 'bool', - }, - { - internalType: 'bool', - name: 'canChangeCap', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'newCap', - type: 'uint256', - }, - ], - name: 'setCap', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'setController', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bool', - name: 'publicSwap', - type: 'bool', - }, - ], - name: 'setPublicSwap', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'swapFee', - type: 'uint256', - }, - ], - name: 'setSwapFee', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - { - internalType: 'uint256', - name: 'newWeight', - type: 'uint256', - }, - ], - name: 'updateWeight', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256[]', - name: 'newWeights', - type: 'uint256[]', - }, - { - internalType: 'uint256', - name: 'startBlock', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'endBlock', - type: 'uint256', - }, - ], - name: 'updateWeightsGradually', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'provider', - type: 'address', - }, - ], - name: 'whitelistLiquidityProvider', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type AaveAbpt = typeof aaveAbptAbi; -export type AaveAbptContract = GetContractReturnType; - -export class AaveAbpt__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: aaveAbptAbi, publicClient: client }); - } -} diff --git a/src/apps/aave-safety-module/contracts/viem/AaveBpt.ts b/src/apps/aave-safety-module/contracts/viem/AaveBpt.ts deleted file mode 100644 index 0350dd330..000000000 --- a/src/apps/aave-safety-module/contracts/viem/AaveBpt.ts +++ /dev/null @@ -1,1644 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const aaveBptAbi = [ - { - inputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'src', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'dst', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amt', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: true, - inputs: [ - { - indexed: true, - internalType: 'bytes4', - name: 'sig', - type: 'bytes4', - }, - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - indexed: false, - internalType: 'bytes', - name: 'data', - type: 'bytes', - }, - ], - name: 'LOG_CALL', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'tokenOut', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'tokenAmountOut', - type: 'uint256', - }, - ], - name: 'LOG_EXIT', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'tokenIn', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'tokenAmountIn', - type: 'uint256', - }, - ], - name: 'LOG_JOIN', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'tokenIn', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'tokenOut', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'tokenAmountIn', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'tokenAmountOut', - type: 'uint256', - }, - ], - name: 'LOG_SWAP', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'src', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'dst', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amt', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - constant: true, - inputs: [], - name: 'BONE', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'BPOW_PRECISION', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'EXIT_FEE', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'INIT_POOL_SUPPLY', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'MAX_BOUND_TOKENS', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'MAX_BPOW_BASE', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'MAX_FEE', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'MAX_IN_RATIO', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'MAX_OUT_RATIO', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'MAX_TOTAL_WEIGHT', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'MAX_WEIGHT', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'MIN_BALANCE', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'MIN_BOUND_TOKENS', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'MIN_BPOW_BASE', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'MIN_FEE', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'MIN_WEIGHT', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'address', - name: 'src', - type: 'address', - }, - { - internalType: 'address', - name: 'dst', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'dst', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amt', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'address', - name: 'whom', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - { - internalType: 'uint256', - name: 'balance', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'denorm', - type: 'uint256', - }, - ], - name: 'bind', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'uint256', - name: 'tokenBalanceIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tokenWeightIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tokenBalanceOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tokenWeightOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tokenAmountOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'swapFee', - type: 'uint256', - }, - ], - name: 'calcInGivenOut', - outputs: [ - { - internalType: 'uint256', - name: 'tokenAmountIn', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'uint256', - name: 'tokenBalanceIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tokenWeightIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tokenBalanceOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tokenWeightOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tokenAmountIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'swapFee', - type: 'uint256', - }, - ], - name: 'calcOutGivenIn', - outputs: [ - { - internalType: 'uint256', - name: 'tokenAmountOut', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'uint256', - name: 'tokenBalanceOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tokenWeightOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'poolSupply', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalWeight', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tokenAmountOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'swapFee', - type: 'uint256', - }, - ], - name: 'calcPoolInGivenSingleOut', - outputs: [ - { - internalType: 'uint256', - name: 'poolAmountIn', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'uint256', - name: 'tokenBalanceIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tokenWeightIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'poolSupply', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalWeight', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tokenAmountIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'swapFee', - type: 'uint256', - }, - ], - name: 'calcPoolOutGivenSingleIn', - outputs: [ - { - internalType: 'uint256', - name: 'poolAmountOut', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'uint256', - name: 'tokenBalanceIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tokenWeightIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'poolSupply', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalWeight', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'poolAmountOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'swapFee', - type: 'uint256', - }, - ], - name: 'calcSingleInGivenPoolOut', - outputs: [ - { - internalType: 'uint256', - name: 'tokenAmountIn', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'uint256', - name: 'tokenBalanceOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tokenWeightOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'poolSupply', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalWeight', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'poolAmountIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'swapFee', - type: 'uint256', - }, - ], - name: 'calcSingleOutGivenPoolIn', - outputs: [ - { - internalType: 'uint256', - name: 'tokenAmountOut', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'uint256', - name: 'tokenBalanceIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tokenWeightIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tokenBalanceOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'tokenWeightOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'swapFee', - type: 'uint256', - }, - ], - name: 'calcSpotPrice', - outputs: [ - { - internalType: 'uint256', - name: 'spotPrice', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'dst', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amt', - type: 'uint256', - }, - ], - name: 'decreaseApproval', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'uint256', - name: 'poolAmountIn', - type: 'uint256', - }, - { - internalType: 'uint256[]', - name: 'minAmountsOut', - type: 'uint256[]', - }, - ], - name: 'exitPool', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'tokenOut', - type: 'address', - }, - { - internalType: 'uint256', - name: 'tokenAmountOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'maxPoolAmountIn', - type: 'uint256', - }, - ], - name: 'exitswapExternAmountOut', - outputs: [ - { - internalType: 'uint256', - name: 'poolAmountIn', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'tokenOut', - type: 'address', - }, - { - internalType: 'uint256', - name: 'poolAmountIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'minAmountOut', - type: 'uint256', - }, - ], - name: 'exitswapPoolAmountIn', - outputs: [ - { - internalType: 'uint256', - name: 'tokenAmountOut', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [], - name: 'finalize', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - ], - name: 'getBalance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'getColor', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'getController', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'getCurrentTokens', - outputs: [ - { - internalType: 'address[]', - name: 'tokens', - type: 'address[]', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - ], - name: 'getDenormalizedWeight', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'getFinalTokens', - outputs: [ - { - internalType: 'address[]', - name: 'tokens', - type: 'address[]', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - ], - name: 'getNormalizedWeight', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'getNumTokens', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'address', - name: 'tokenIn', - type: 'address', - }, - { - internalType: 'address', - name: 'tokenOut', - type: 'address', - }, - ], - name: 'getSpotPrice', - outputs: [ - { - internalType: 'uint256', - name: 'spotPrice', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'address', - name: 'tokenIn', - type: 'address', - }, - { - internalType: 'address', - name: 'tokenOut', - type: 'address', - }, - ], - name: 'getSpotPriceSansFee', - outputs: [ - { - internalType: 'uint256', - name: 'spotPrice', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'getSwapFee', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'getTotalDenormalizedWeight', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - ], - name: 'gulp', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'dst', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amt', - type: 'uint256', - }, - ], - name: 'increaseApproval', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'address', - name: 't', - type: 'address', - }, - ], - name: 'isBound', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'isFinalized', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'isPublicSwap', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'uint256', - name: 'poolAmountOut', - type: 'uint256', - }, - { - internalType: 'uint256[]', - name: 'maxAmountsIn', - type: 'uint256[]', - }, - ], - name: 'joinPool', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'tokenIn', - type: 'address', - }, - { - internalType: 'uint256', - name: 'tokenAmountIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'minPoolAmountOut', - type: 'uint256', - }, - ], - name: 'joinswapExternAmountIn', - outputs: [ - { - internalType: 'uint256', - name: 'poolAmountOut', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'tokenIn', - type: 'address', - }, - { - internalType: 'uint256', - name: 'poolAmountOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'maxAmountIn', - type: 'uint256', - }, - ], - name: 'joinswapPoolAmountOut', - outputs: [ - { - internalType: 'uint256', - name: 'tokenAmountIn', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - { - internalType: 'uint256', - name: 'balance', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'denorm', - type: 'uint256', - }, - ], - name: 'rebind', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'manager', - type: 'address', - }, - ], - name: 'setController', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'bool', - name: 'public_', - type: 'bool', - }, - ], - name: 'setPublicSwap', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'uint256', - name: 'swapFee', - type: 'uint256', - }, - ], - name: 'setSwapFee', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'tokenIn', - type: 'address', - }, - { - internalType: 'uint256', - name: 'tokenAmountIn', - type: 'uint256', - }, - { - internalType: 'address', - name: 'tokenOut', - type: 'address', - }, - { - internalType: 'uint256', - name: 'minAmountOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'maxPrice', - type: 'uint256', - }, - ], - name: 'swapExactAmountIn', - outputs: [ - { - internalType: 'uint256', - name: 'tokenAmountOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'spotPriceAfter', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'tokenIn', - type: 'address', - }, - { - internalType: 'uint256', - name: 'maxAmountIn', - type: 'uint256', - }, - { - internalType: 'address', - name: 'tokenOut', - type: 'address', - }, - { - internalType: 'uint256', - name: 'tokenAmountOut', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'maxPrice', - type: 'uint256', - }, - ], - name: 'swapExactAmountOut', - outputs: [ - { - internalType: 'uint256', - name: 'tokenAmountIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'spotPriceAfter', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'dst', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amt', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'src', - type: 'address', - }, - { - internalType: 'address', - name: 'dst', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amt', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - ], - name: 'unbind', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type AaveBpt = typeof aaveBptAbi; -export type AaveBptContract = GetContractReturnType; - -export class AaveBpt__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: aaveBptAbi, publicClient: client }); - } -} diff --git a/src/apps/aave-safety-module/contracts/viem/AaveStkApyHelper.ts b/src/apps/aave-safety-module/contracts/viem/AaveStkApyHelper.ts deleted file mode 100644 index 731484d91..000000000 --- a/src/apps/aave-safety-module/contracts/viem/AaveStkApyHelper.ts +++ /dev/null @@ -1,465 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const aaveStkApyHelperAbi = [ - { - inputs: [ - { - internalType: 'contract IPriceOracle', - name: 'priceOracle', - type: 'address', - }, - { - internalType: 'contract BPTPriceFeedI', - name: 'bptPriceFeed', - type: 'address', - }, - { - internalType: 'address', - name: 'aave', - type: 'address', - }, - { - internalType: 'contract IStakedToken', - name: 'stkAave', - type: 'address', - }, - { - internalType: 'address', - name: 'bpt', - type: 'address', - }, - { - internalType: 'contract IStakedToken', - name: 'stkBpt', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - inputs: [], - name: 'AAVE', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'BPT', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'BPT_PRICE_FEED', - outputs: [ - { - internalType: 'contract BPTPriceFeedI', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'PRICE_ORACLE', - outputs: [ - { - internalType: 'contract IPriceOracle', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'STAKED_AAVE', - outputs: [ - { - internalType: 'contract IStakedToken', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'STAKED_BPT', - outputs: [ - { - internalType: 'contract IStakedToken', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - ], - name: 'getStkAaveData', - outputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'stakeTokenTotalSupply', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeCooldownSeconds', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeUnstakeWindow', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeTokenPriceEth', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'rewardTokenPriceEth', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeApy', - type: 'uint256', - }, - { - internalType: 'uint128', - name: 'distributionPerSecond', - type: 'uint128', - }, - { - internalType: 'uint256', - name: 'distributionEnd', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeTokenUserBalance', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'underlyingTokenUserBalance', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'userCooldown', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'userIncentivesToClaim', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'userPermitNonce', - type: 'uint256', - }, - ], - internalType: 'struct StakeUIHelperI.AssetUIData', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - ], - name: 'getStkBptData', - outputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'stakeTokenTotalSupply', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeCooldownSeconds', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeUnstakeWindow', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeTokenPriceEth', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'rewardTokenPriceEth', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeApy', - type: 'uint256', - }, - { - internalType: 'uint128', - name: 'distributionPerSecond', - type: 'uint128', - }, - { - internalType: 'uint256', - name: 'distributionEnd', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeTokenUserBalance', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'underlyingTokenUserBalance', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'userCooldown', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'userIncentivesToClaim', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'userPermitNonce', - type: 'uint256', - }, - ], - internalType: 'struct StakeUIHelperI.AssetUIData', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - ], - name: 'getUserUIData', - outputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'stakeTokenTotalSupply', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeCooldownSeconds', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeUnstakeWindow', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeTokenPriceEth', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'rewardTokenPriceEth', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeApy', - type: 'uint256', - }, - { - internalType: 'uint128', - name: 'distributionPerSecond', - type: 'uint128', - }, - { - internalType: 'uint256', - name: 'distributionEnd', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeTokenUserBalance', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'underlyingTokenUserBalance', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'userCooldown', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'userIncentivesToClaim', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'userPermitNonce', - type: 'uint256', - }, - ], - internalType: 'struct StakeUIHelperI.AssetUIData', - name: '', - type: 'tuple', - }, - { - components: [ - { - internalType: 'uint256', - name: 'stakeTokenTotalSupply', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeCooldownSeconds', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeUnstakeWindow', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeTokenPriceEth', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'rewardTokenPriceEth', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeApy', - type: 'uint256', - }, - { - internalType: 'uint128', - name: 'distributionPerSecond', - type: 'uint128', - }, - { - internalType: 'uint256', - name: 'distributionEnd', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'stakeTokenUserBalance', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'underlyingTokenUserBalance', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'userCooldown', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'userIncentivesToClaim', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'userPermitNonce', - type: 'uint256', - }, - ], - internalType: 'struct StakeUIHelperI.AssetUIData', - name: '', - type: 'tuple', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, -] as const; - -export type AaveStkApyHelper = typeof aaveStkApyHelperAbi; -export type AaveStkApyHelperContract = GetContractReturnType; - -export class AaveStkApyHelper__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: aaveStkApyHelperAbi, publicClient: client }); - } -} diff --git a/src/apps/aave-safety-module/contracts/viem/index.ts b/src/apps/aave-safety-module/contracts/viem/index.ts index 8a6061d71..a2aa0266f 100644 --- a/src/apps/aave-safety-module/contracts/viem/index.ts +++ b/src/apps/aave-safety-module/contracts/viem/index.ts @@ -2,14 +2,8 @@ /* tslint:disable */ /* eslint-disable */ -export type { AaveAbpt } from './AaveAbpt'; -export type { AaveBpt } from './AaveBpt'; export type { AaveStkAave } from './AaveStkAave'; export type { AaveStkAbpt } from './AaveStkAbpt'; -export type { AaveStkApyHelper } from './AaveStkApyHelper'; -export { AaveAbpt__factory } from './AaveAbpt'; -export { AaveBpt__factory } from './AaveBpt'; export { AaveStkAave__factory } from './AaveStkAave'; export { AaveStkAbpt__factory } from './AaveStkAbpt'; -export { AaveStkApyHelper__factory } from './AaveStkApyHelper'; diff --git a/src/apps/aave-safety-module/ethereum/aave-safety-module.abpt.token-fetcher.ts b/src/apps/aave-safety-module/ethereum/aave-safety-module.abpt.token-fetcher.ts deleted file mode 100644 index b098cb8f0..000000000 --- a/src/apps/aave-safety-module/ethereum/aave-safety-module.abpt.token-fetcher.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { Inject } from '@nestjs/common'; -import { sum } from 'lodash'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { getLabelFromToken } from '~app-toolkit/helpers/presentation/image.present'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - DefaultAppTokenDataProps, - GetDataPropsParams, - GetDisplayPropsParams, - GetPricePerShareParams, - GetUnderlyingTokensParams, -} from '~position/template/app-token.template.types'; - -import { AaveSafetyModuleViemContractFactory } from '../contracts'; -import { AaveAbpt } from '../contracts/viem'; - -type AaveSafetyModuleAbptTokenDataProps = DefaultAppTokenDataProps & { - fee: number; -}; - -@PositionTemplate() -export class EthereumAaveSafetyModuleAbptTokenFetcher extends AppTokenTemplatePositionFetcher< - AaveAbpt, - AaveSafetyModuleAbptTokenDataProps -> { - groupLabel = 'ABPT'; - - readonly bptAddress = '0xc697051d1c6296c24ae3bcef39aca743861d9a81'; - readonly abptAddress = '0x41a08648c3766f9f9d85598ff102a08f4ef84f84'; - readonly aaveAddress = '0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9'; - readonly wethAddress = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(AaveSafetyModuleViemContractFactory) - protected readonly contractFactory: AaveSafetyModuleViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.aaveAbpt({ address, network: this.network }); - } - - async getAddresses(): Promise { - return ['0x41a08648c3766f9f9d85598ff102a08f4ef84f84']; - } - - async getUnderlyingTokenDefinitions(_params: GetUnderlyingTokensParams) { - return [ - { address: this.aaveAddress, network: this.network }, - { address: this.wethAddress, network: this.network }, - ]; - } - - async getPricePerShare({ - appToken, - multicall, - }: GetPricePerShareParams) { - const poolToken = this.contractFactory.aaveBpt({ - address: this.bptAddress, - network: this.network, - }); - - const [wethReserveRaw, aaveReserveRaw] = await Promise.all([ - multicall.wrap(poolToken).read.getBalance([this.wethAddress]), - multicall.wrap(poolToken).read.getBalance([this.aaveAddress]), - ]); - - const aaveReserve = Number(aaveReserveRaw) / 10 ** 18; - const wethReserve = Number(wethReserveRaw) / 10 ** 18; - return [aaveReserve / appToken.supply, wethReserve / appToken.supply]; - } - - async getLiquidity({ appToken }: GetDataPropsParams) { - const reserves = (appToken.pricePerShare as number[]).map(v => v * appToken.supply); - const liquidity = sum(reserves.map((v, i) => v * appToken.tokens[i].price)); - return liquidity; - } - - async getDataProps(params: GetDataPropsParams) { - const defaultDataProps = await super.getDataProps(params); - return { ...defaultDataProps, fee: 0.003 }; - } - - async getLabel({ appToken }: GetDisplayPropsParams) { - return appToken.tokens.map(v => getLabelFromToken(v)).join(' / '); - } - - async getSecondaryLabel({ appToken }: GetDisplayPropsParams) { - const { reserves, liquidity } = appToken.dataProps; - const reservePercentages = appToken.tokens.map((t, i) => reserves[i] * (t.price / liquidity)); - return reservePercentages.map(p => `${Math.round(p * 100)}%`).join(' / '); - } -} diff --git a/src/apps/across/across.module.ts b/src/apps/across/across.module.ts index 157a8fcf7..7a1cd8a9a 100644 --- a/src/apps/across/across.module.ts +++ b/src/apps/across/across.module.ts @@ -3,16 +3,10 @@ import { Module } from '@nestjs/common'; import { AbstractApp } from '~app/app.dynamic-module'; import { AcrossViemContractFactory } from './contracts'; -import { EthereumAcrossPoolV1TokenFetcher } from './ethereum/across.pool-v1.token-fetcher'; import { EthereumAcrossPoolV2TokenFetcher } from './ethereum/across.pool-v2.token-fetcher'; import { EthereumStakingContractPositionFetcher } from './ethereum/across.staking.contract-position-fetcher'; @Module({ - providers: [ - AcrossViemContractFactory, - EthereumAcrossPoolV1TokenFetcher, - EthereumAcrossPoolV2TokenFetcher, - EthereumStakingContractPositionFetcher, - ], + providers: [AcrossViemContractFactory, EthereumAcrossPoolV2TokenFetcher, EthereumStakingContractPositionFetcher], }) export class AcrossAppModule extends AbstractApp() {} diff --git a/src/apps/across/common/across.pool-v1.token-fetcher.ts b/src/apps/across/common/across.pool-v1.token-fetcher.ts deleted file mode 100644 index fd3f9a2dc..000000000 --- a/src/apps/across/common/across.pool-v1.token-fetcher.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { getLabelFromToken } from '~app-toolkit/helpers/presentation/image.present'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetDataPropsParams, - GetDisplayPropsParams, - GetPricePerShareParams, - GetUnderlyingTokensParams, -} from '~position/template/app-token.template.types'; - -import { AcrossViemContractFactory } from '../contracts'; -import { AcrossPoolV1 } from '../contracts/viem/AcrossPoolV1'; - -export abstract class AcrossPoolV1TokenFetcher extends AppTokenTemplatePositionFetcher { - abstract poolAddresses: string[]; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(AcrossViemContractFactory) protected readonly contractFactory: AcrossViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.acrossPoolV1({ network: this.network, address }); - } - - async getAddresses() { - return this.poolAddresses; - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.l1Token(), network: this.network }]; - } - - async getPricePerShare({ contract, appToken, multicall }: GetPricePerShareParams) { - const pricePerShareRaw = await multicall - .wrap(contract) - .simulate.exchangeRateCurrent() - .then(v => v.result); - const decimals = appToken.tokens[0].decimals; - return [Number(pricePerShareRaw) / 10 ** decimals]; - } - - async getLiquidity({ contract, appToken }: GetDataPropsParams) { - const reserveRaw = await contract.read.liquidReserves(); - const reserve = Number(reserveRaw) / 10 ** appToken.tokens[0].decimals; - return reserve * appToken.tokens[0].price; - } - - async getReserves({ contract, appToken }: GetDataPropsParams) { - const reserveRaw = await contract.read.liquidReserves(); - return [Number(reserveRaw) / 10 ** appToken.tokens[0].decimals]; - } - - async getLabel({ appToken }: GetDisplayPropsParams): Promise { - return getLabelFromToken(appToken.tokens[0]); - } -} diff --git a/src/apps/across/contracts/abis/across-pool-v-1.json b/src/apps/across/contracts/abis/across-pool-v-1.json deleted file mode 100644 index c605e0770..000000000 --- a/src/apps/across/contracts/abis/across-pool-v-1.json +++ /dev/null @@ -1,1635 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "string", - "name": "_lpTokenName", - "type": "string" - }, - { - "internalType": "string", - "name": "_lpTokenSymbol", - "type": "string" - }, - { - "internalType": "address", - "name": "_bridgeAdmin", - "type": "address" - }, - { - "internalType": "address", - "name": "_l1Token", - "type": "address" - }, - { - "internalType": "uint64", - "name": "_lpFeeRatePerSecond", - "type": "uint64" - }, - { - "internalType": "bool", - "name": "_isWethPool", - "type": "bool" - }, - { - "internalType": "address", - "name": "_timer", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "oldAdmin", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "BridgePoolAdminTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "depositHash", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "depositId", - "type": "uint64" - }, - { - "internalType": "address payable", - "name": "l1Recipient", - "type": "address" - }, - { - "internalType": "address", - "name": "l2Sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "slowRelayFeePct", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "instantRelayFeePct", - "type": "uint64" - }, - { - "internalType": "uint32", - "name": "quoteTimestamp", - "type": "uint32" - } - ], - "indexed": false, - "internalType": "struct BridgePool.DepositData", - "name": "depositData", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "enum BridgePool.RelayState", - "name": "relayState", - "type": "uint8" - }, - { - "internalType": "address", - "name": "slowRelayer", - "type": "address" - }, - { - "internalType": "uint32", - "name": "relayId", - "type": "uint32" - }, - { - "internalType": "uint64", - "name": "realizedLpFeePct", - "type": "uint64" - }, - { - "internalType": "uint32", - "name": "priceRequestTime", - "type": "uint32" - }, - { - "internalType": "uint256", - "name": "proposerBond", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "finalFee", - "type": "uint256" - } - ], - "indexed": false, - "internalType": "struct BridgePool.RelayData", - "name": "relay", - "type": "tuple" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "relayAncillaryDataHash", - "type": "bytes32" - } - ], - "name": "DepositRelayed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "lpTokensMinted", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "liquidityProvider", - "type": "address" - } - ], - "name": "LiquidityAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "lpTokensBurnt", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "liquidityProvider", - "type": "address" - } - ], - "name": "LiquidityRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "depositHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "relayHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "disputer", - "type": "address" - } - ], - "name": "RelayCanceled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "depositHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "relayHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "disputer", - "type": "address" - } - ], - "name": "RelayDisputed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "depositHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "caller", - "type": "address" - }, - { - "components": [ - { - "internalType": "enum BridgePool.RelayState", - "name": "relayState", - "type": "uint8" - }, - { - "internalType": "address", - "name": "slowRelayer", - "type": "address" - }, - { - "internalType": "uint32", - "name": "relayId", - "type": "uint32" - }, - { - "internalType": "uint64", - "name": "realizedLpFeePct", - "type": "uint64" - }, - { - "internalType": "uint32", - "name": "priceRequestTime", - "type": "uint32" - }, - { - "internalType": "uint256", - "name": "proposerBond", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "finalFee", - "type": "uint256" - } - ], - "indexed": false, - "internalType": "struct BridgePool.RelayData", - "name": "relay", - "type": "tuple" - } - ], - "name": "RelaySettled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "depositHash", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "instantRelayer", - "type": "address" - }, - { - "components": [ - { - "internalType": "enum BridgePool.RelayState", - "name": "relayState", - "type": "uint8" - }, - { - "internalType": "address", - "name": "slowRelayer", - "type": "address" - }, - { - "internalType": "uint32", - "name": "relayId", - "type": "uint32" - }, - { - "internalType": "uint64", - "name": "realizedLpFeePct", - "type": "uint64" - }, - { - "internalType": "uint32", - "name": "priceRequestTime", - "type": "uint32" - }, - { - "internalType": "uint256", - "name": "proposerBond", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "finalFee", - "type": "uint256" - } - ], - "indexed": false, - "internalType": "struct BridgePool.RelayData", - "name": "relay", - "type": "tuple" - } - ], - "name": "RelaySpedUp", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "l1TokenAmount", - "type": "uint256" - } - ], - "name": "addLiquidity", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "bonds", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "bridgeAdmin", - "outputs": [ - { - "internalType": "contract BridgeAdminInterface", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newAdmin", - "type": "address" - } - ], - "name": "changeAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "depositId", - "type": "uint64" - }, - { - "internalType": "address payable", - "name": "l1Recipient", - "type": "address" - }, - { - "internalType": "address", - "name": "l2Sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "slowRelayFeePct", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "instantRelayFeePct", - "type": "uint64" - }, - { - "internalType": "uint32", - "name": "quoteTimestamp", - "type": "uint32" - } - ], - "internalType": "struct BridgePool.DepositData", - "name": "depositData", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "enum BridgePool.RelayState", - "name": "relayState", - "type": "uint8" - }, - { - "internalType": "address", - "name": "slowRelayer", - "type": "address" - }, - { - "internalType": "uint32", - "name": "relayId", - "type": "uint32" - }, - { - "internalType": "uint64", - "name": "realizedLpFeePct", - "type": "uint64" - }, - { - "internalType": "uint32", - "name": "priceRequestTime", - "type": "uint32" - }, - { - "internalType": "uint256", - "name": "proposerBond", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "finalFee", - "type": "uint256" - } - ], - "internalType": "struct BridgePool.RelayData", - "name": "relayData", - "type": "tuple" - } - ], - "name": "disputeRelay", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "exchangeRateCurrent", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getAccumulatedFees", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getCurrentTime", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "relayedAmount", - "type": "uint256" - } - ], - "name": "getLiquidityUtilization", - "outputs": [ - { - "internalType": "uint256", - "name": "utilizationCurrent", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "utilizationPostRelay", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "depositId", - "type": "uint64" - }, - { - "internalType": "address payable", - "name": "l1Recipient", - "type": "address" - }, - { - "internalType": "address", - "name": "l2Sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "slowRelayFeePct", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "instantRelayFeePct", - "type": "uint64" - }, - { - "internalType": "uint32", - "name": "quoteTimestamp", - "type": "uint32" - } - ], - "internalType": "struct BridgePool.DepositData", - "name": "depositData", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "enum BridgePool.RelayState", - "name": "relayState", - "type": "uint8" - }, - { - "internalType": "address", - "name": "slowRelayer", - "type": "address" - }, - { - "internalType": "uint32", - "name": "relayId", - "type": "uint32" - }, - { - "internalType": "uint64", - "name": "realizedLpFeePct", - "type": "uint64" - }, - { - "internalType": "uint32", - "name": "priceRequestTime", - "type": "uint32" - }, - { - "internalType": "uint256", - "name": "proposerBond", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "finalFee", - "type": "uint256" - } - ], - "internalType": "struct BridgePool.RelayData", - "name": "relayData", - "type": "tuple" - } - ], - "name": "getRelayAncillaryData", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "identifier", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "instantRelays", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "isWethPool", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "l1Token", - "outputs": [ - { - "internalType": "contract IERC20", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lastLpFeeUpdate", - "outputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "liquidReserves", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "liquidityUtilizationCurrent", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "relayedAmount", - "type": "uint256" - } - ], - "name": "liquidityUtilizationPostRelay", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "lpFeeRatePerSecond", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes[]", - "name": "data", - "type": "bytes[]" - } - ], - "name": "multicall", - "outputs": [ - { - "internalType": "bytes[]", - "name": "results", - "type": "bytes[]" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "numberOfRelays", - "outputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "optimisticOracle", - "outputs": [ - { - "internalType": "contract SkinnyOptimisticOracleInterface", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "optimisticOracleLiveness", - "outputs": [ - { - "internalType": "uint32", - "name": "", - "type": "uint32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pendingReserves", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "proposerBondPct", - "outputs": [ - { - "internalType": "uint64", - "name": "", - "type": "uint64" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "depositId", - "type": "uint64" - }, - { - "internalType": "address payable", - "name": "l1Recipient", - "type": "address" - }, - { - "internalType": "address", - "name": "l2Sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "slowRelayFeePct", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "instantRelayFeePct", - "type": "uint64" - }, - { - "internalType": "uint32", - "name": "quoteTimestamp", - "type": "uint32" - } - ], - "internalType": "struct BridgePool.DepositData", - "name": "depositData", - "type": "tuple" - }, - { - "internalType": "uint64", - "name": "realizedLpFeePct", - "type": "uint64" - } - ], - "name": "relayAndSpeedUp", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "depositId", - "type": "uint64" - }, - { - "internalType": "address payable", - "name": "l1Recipient", - "type": "address" - }, - { - "internalType": "address", - "name": "l2Sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "slowRelayFeePct", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "instantRelayFeePct", - "type": "uint64" - }, - { - "internalType": "uint32", - "name": "quoteTimestamp", - "type": "uint32" - } - ], - "internalType": "struct BridgePool.DepositData", - "name": "depositData", - "type": "tuple" - }, - { - "internalType": "uint64", - "name": "realizedLpFeePct", - "type": "uint64" - } - ], - "name": "relayDeposit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "name": "relays", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "lpTokenAmount", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "sendEth", - "type": "bool" - } - ], - "name": "removeLiquidity", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "time", - "type": "uint256" - } - ], - "name": "setCurrentTime", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "depositId", - "type": "uint64" - }, - { - "internalType": "address payable", - "name": "l1Recipient", - "type": "address" - }, - { - "internalType": "address", - "name": "l2Sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "slowRelayFeePct", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "instantRelayFeePct", - "type": "uint64" - }, - { - "internalType": "uint32", - "name": "quoteTimestamp", - "type": "uint32" - } - ], - "internalType": "struct BridgePool.DepositData", - "name": "depositData", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "enum BridgePool.RelayState", - "name": "relayState", - "type": "uint8" - }, - { - "internalType": "address", - "name": "slowRelayer", - "type": "address" - }, - { - "internalType": "uint32", - "name": "relayId", - "type": "uint32" - }, - { - "internalType": "uint64", - "name": "realizedLpFeePct", - "type": "uint64" - }, - { - "internalType": "uint32", - "name": "priceRequestTime", - "type": "uint32" - }, - { - "internalType": "uint256", - "name": "proposerBond", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "finalFee", - "type": "uint256" - } - ], - "internalType": "struct BridgePool.RelayData", - "name": "relayData", - "type": "tuple" - } - ], - "name": "settleRelay", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "depositId", - "type": "uint64" - }, - { - "internalType": "address payable", - "name": "l1Recipient", - "type": "address" - }, - { - "internalType": "address", - "name": "l2Sender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint64", - "name": "slowRelayFeePct", - "type": "uint64" - }, - { - "internalType": "uint64", - "name": "instantRelayFeePct", - "type": "uint64" - }, - { - "internalType": "uint32", - "name": "quoteTimestamp", - "type": "uint32" - } - ], - "internalType": "struct BridgePool.DepositData", - "name": "depositData", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "enum BridgePool.RelayState", - "name": "relayState", - "type": "uint8" - }, - { - "internalType": "address", - "name": "slowRelayer", - "type": "address" - }, - { - "internalType": "uint32", - "name": "relayId", - "type": "uint32" - }, - { - "internalType": "uint64", - "name": "realizedLpFeePct", - "type": "uint64" - }, - { - "internalType": "uint32", - "name": "priceRequestTime", - "type": "uint32" - }, - { - "internalType": "uint256", - "name": "proposerBond", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "finalFee", - "type": "uint256" - } - ], - "internalType": "struct BridgePool.RelayData", - "name": "relayData", - "type": "tuple" - } - ], - "name": "speedUpRelay", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "store", - "outputs": [ - { - "internalType": "contract StoreInterface", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "sync", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "syncUmaEcosystemParams", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "syncWithBridgeAdminParams", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "timerAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "undistributedLpFees", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "utilizedReserves", - "outputs": [ - { - "internalType": "int256", - "name": "", - "type": "int256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } -] diff --git a/src/apps/across/contracts/viem.contract-factory.ts b/src/apps/across/contracts/viem.contract-factory.ts index 88729eb7f..3de7608f2 100644 --- a/src/apps/across/contracts/viem.contract-factory.ts +++ b/src/apps/across/contracts/viem.contract-factory.ts @@ -3,7 +3,7 @@ import { Injectable, Inject } from '@nestjs/common'; import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; import { Network } from '~types/network.interface'; -import { AcrossHubPoolV2__factory, AcrossPoolV1__factory, AcrossPoolV2__factory, AcrossStaking__factory } from './viem'; +import { AcrossHubPoolV2__factory, AcrossPoolV2__factory, AcrossStaking__factory } from './viem'; type ContractOpts = { address: string; network: Network }; @@ -14,9 +14,6 @@ export class AcrossViemContractFactory { acrossHubPoolV2({ address, network }: ContractOpts) { return AcrossHubPoolV2__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } - acrossPoolV1({ address, network }: ContractOpts) { - return AcrossPoolV1__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } acrossPoolV2({ address, network }: ContractOpts) { return AcrossPoolV2__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } diff --git a/src/apps/across/contracts/viem/AcrossPoolV1.ts b/src/apps/across/contracts/viem/AcrossPoolV1.ts deleted file mode 100644 index 069613b71..000000000 --- a/src/apps/across/contracts/viem/AcrossPoolV1.ts +++ /dev/null @@ -1,1649 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const acrossPoolV1Abi = [ - { - inputs: [ - { - internalType: 'string', - name: '_lpTokenName', - type: 'string', - }, - { - internalType: 'string', - name: '_lpTokenSymbol', - type: 'string', - }, - { - internalType: 'address', - name: '_bridgeAdmin', - type: 'address', - }, - { - internalType: 'address', - name: '_l1Token', - type: 'address', - }, - { - internalType: 'uint64', - name: '_lpFeeRatePerSecond', - type: 'uint64', - }, - { - internalType: 'bool', - name: '_isWethPool', - type: 'bool', - }, - { - internalType: 'address', - name: '_timer', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'oldAdmin', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: 'newAdmin', - type: 'address', - }, - ], - name: 'BridgePoolAdminTransferred', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'depositHash', - type: 'bytes32', - }, - { - components: [ - { - internalType: 'uint256', - name: 'chainId', - type: 'uint256', - }, - { - internalType: 'uint64', - name: 'depositId', - type: 'uint64', - }, - { - internalType: 'address payable', - name: 'l1Recipient', - type: 'address', - }, - { - internalType: 'address', - name: 'l2Sender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint64', - name: 'slowRelayFeePct', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'instantRelayFeePct', - type: 'uint64', - }, - { - internalType: 'uint32', - name: 'quoteTimestamp', - type: 'uint32', - }, - ], - indexed: false, - internalType: 'struct BridgePool.DepositData', - name: 'depositData', - type: 'tuple', - }, - { - components: [ - { - internalType: 'enum BridgePool.RelayState', - name: 'relayState', - type: 'uint8', - }, - { - internalType: 'address', - name: 'slowRelayer', - type: 'address', - }, - { - internalType: 'uint32', - name: 'relayId', - type: 'uint32', - }, - { - internalType: 'uint64', - name: 'realizedLpFeePct', - type: 'uint64', - }, - { - internalType: 'uint32', - name: 'priceRequestTime', - type: 'uint32', - }, - { - internalType: 'uint256', - name: 'proposerBond', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'finalFee', - type: 'uint256', - }, - ], - indexed: false, - internalType: 'struct BridgePool.RelayData', - name: 'relay', - type: 'tuple', - }, - { - indexed: false, - internalType: 'bytes32', - name: 'relayAncillaryDataHash', - type: 'bytes32', - }, - ], - name: 'DepositRelayed', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'lpTokensMinted', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'liquidityProvider', - type: 'address', - }, - ], - name: 'LiquidityAdded', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'lpTokensBurnt', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'liquidityProvider', - type: 'address', - }, - ], - name: 'LiquidityRemoved', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'depositHash', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'bytes32', - name: 'relayHash', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'address', - name: 'disputer', - type: 'address', - }, - ], - name: 'RelayCanceled', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'depositHash', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'bytes32', - name: 'relayHash', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'address', - name: 'disputer', - type: 'address', - }, - ], - name: 'RelayDisputed', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'depositHash', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - components: [ - { - internalType: 'enum BridgePool.RelayState', - name: 'relayState', - type: 'uint8', - }, - { - internalType: 'address', - name: 'slowRelayer', - type: 'address', - }, - { - internalType: 'uint32', - name: 'relayId', - type: 'uint32', - }, - { - internalType: 'uint64', - name: 'realizedLpFeePct', - type: 'uint64', - }, - { - internalType: 'uint32', - name: 'priceRequestTime', - type: 'uint32', - }, - { - internalType: 'uint256', - name: 'proposerBond', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'finalFee', - type: 'uint256', - }, - ], - indexed: false, - internalType: 'struct BridgePool.RelayData', - name: 'relay', - type: 'tuple', - }, - ], - name: 'RelaySettled', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'depositHash', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'address', - name: 'instantRelayer', - type: 'address', - }, - { - components: [ - { - internalType: 'enum BridgePool.RelayState', - name: 'relayState', - type: 'uint8', - }, - { - internalType: 'address', - name: 'slowRelayer', - type: 'address', - }, - { - internalType: 'uint32', - name: 'relayId', - type: 'uint32', - }, - { - internalType: 'uint64', - name: 'realizedLpFeePct', - type: 'uint64', - }, - { - internalType: 'uint32', - name: 'priceRequestTime', - type: 'uint32', - }, - { - internalType: 'uint256', - name: 'proposerBond', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'finalFee', - type: 'uint256', - }, - ], - indexed: false, - internalType: 'struct BridgePool.RelayData', - name: 'relay', - type: 'tuple', - }, - ], - name: 'RelaySpedUp', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'l1TokenAmount', - type: 'uint256', - }, - ], - name: 'addLiquidity', - outputs: [], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'bonds', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'bridgeAdmin', - outputs: [ - { - internalType: 'contract BridgeAdminInterface', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_newAdmin', - type: 'address', - }, - ], - name: 'changeAdmin', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'subtractedValue', - type: 'uint256', - }, - ], - name: 'decreaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'chainId', - type: 'uint256', - }, - { - internalType: 'uint64', - name: 'depositId', - type: 'uint64', - }, - { - internalType: 'address payable', - name: 'l1Recipient', - type: 'address', - }, - { - internalType: 'address', - name: 'l2Sender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint64', - name: 'slowRelayFeePct', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'instantRelayFeePct', - type: 'uint64', - }, - { - internalType: 'uint32', - name: 'quoteTimestamp', - type: 'uint32', - }, - ], - internalType: 'struct BridgePool.DepositData', - name: 'depositData', - type: 'tuple', - }, - { - components: [ - { - internalType: 'enum BridgePool.RelayState', - name: 'relayState', - type: 'uint8', - }, - { - internalType: 'address', - name: 'slowRelayer', - type: 'address', - }, - { - internalType: 'uint32', - name: 'relayId', - type: 'uint32', - }, - { - internalType: 'uint64', - name: 'realizedLpFeePct', - type: 'uint64', - }, - { - internalType: 'uint32', - name: 'priceRequestTime', - type: 'uint32', - }, - { - internalType: 'uint256', - name: 'proposerBond', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'finalFee', - type: 'uint256', - }, - ], - internalType: 'struct BridgePool.RelayData', - name: 'relayData', - type: 'tuple', - }, - ], - name: 'disputeRelay', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'exchangeRateCurrent', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'getAccumulatedFees', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getCurrentTime', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'relayedAmount', - type: 'uint256', - }, - ], - name: 'getLiquidityUtilization', - outputs: [ - { - internalType: 'uint256', - name: 'utilizationCurrent', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'utilizationPostRelay', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'chainId', - type: 'uint256', - }, - { - internalType: 'uint64', - name: 'depositId', - type: 'uint64', - }, - { - internalType: 'address payable', - name: 'l1Recipient', - type: 'address', - }, - { - internalType: 'address', - name: 'l2Sender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint64', - name: 'slowRelayFeePct', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'instantRelayFeePct', - type: 'uint64', - }, - { - internalType: 'uint32', - name: 'quoteTimestamp', - type: 'uint32', - }, - ], - internalType: 'struct BridgePool.DepositData', - name: 'depositData', - type: 'tuple', - }, - { - components: [ - { - internalType: 'enum BridgePool.RelayState', - name: 'relayState', - type: 'uint8', - }, - { - internalType: 'address', - name: 'slowRelayer', - type: 'address', - }, - { - internalType: 'uint32', - name: 'relayId', - type: 'uint32', - }, - { - internalType: 'uint64', - name: 'realizedLpFeePct', - type: 'uint64', - }, - { - internalType: 'uint32', - name: 'priceRequestTime', - type: 'uint32', - }, - { - internalType: 'uint256', - name: 'proposerBond', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'finalFee', - type: 'uint256', - }, - ], - internalType: 'struct BridgePool.RelayData', - name: 'relayData', - type: 'tuple', - }, - ], - name: 'getRelayAncillaryData', - outputs: [ - { - internalType: 'bytes', - name: '', - type: 'bytes', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'identifier', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'addedValue', - type: 'uint256', - }, - ], - name: 'increaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - name: 'instantRelays', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'isWethPool', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'l1Token', - outputs: [ - { - internalType: 'contract IERC20', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'lastLpFeeUpdate', - outputs: [ - { - internalType: 'uint32', - name: '', - type: 'uint32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'liquidReserves', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'liquidityUtilizationCurrent', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'relayedAmount', - type: 'uint256', - }, - ], - name: 'liquidityUtilizationPostRelay', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'lpFeeRatePerSecond', - outputs: [ - { - internalType: 'uint64', - name: '', - type: 'uint64', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes[]', - name: 'data', - type: 'bytes[]', - }, - ], - name: 'multicall', - outputs: [ - { - internalType: 'bytes[]', - name: 'results', - type: 'bytes[]', - }, - ], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'numberOfRelays', - outputs: [ - { - internalType: 'uint32', - name: '', - type: 'uint32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'optimisticOracle', - outputs: [ - { - internalType: 'contract SkinnyOptimisticOracleInterface', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'optimisticOracleLiveness', - outputs: [ - { - internalType: 'uint32', - name: '', - type: 'uint32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'pendingReserves', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'proposerBondPct', - outputs: [ - { - internalType: 'uint64', - name: '', - type: 'uint64', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'chainId', - type: 'uint256', - }, - { - internalType: 'uint64', - name: 'depositId', - type: 'uint64', - }, - { - internalType: 'address payable', - name: 'l1Recipient', - type: 'address', - }, - { - internalType: 'address', - name: 'l2Sender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint64', - name: 'slowRelayFeePct', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'instantRelayFeePct', - type: 'uint64', - }, - { - internalType: 'uint32', - name: 'quoteTimestamp', - type: 'uint32', - }, - ], - internalType: 'struct BridgePool.DepositData', - name: 'depositData', - type: 'tuple', - }, - { - internalType: 'uint64', - name: 'realizedLpFeePct', - type: 'uint64', - }, - ], - name: 'relayAndSpeedUp', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'chainId', - type: 'uint256', - }, - { - internalType: 'uint64', - name: 'depositId', - type: 'uint64', - }, - { - internalType: 'address payable', - name: 'l1Recipient', - type: 'address', - }, - { - internalType: 'address', - name: 'l2Sender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint64', - name: 'slowRelayFeePct', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'instantRelayFeePct', - type: 'uint64', - }, - { - internalType: 'uint32', - name: 'quoteTimestamp', - type: 'uint32', - }, - ], - internalType: 'struct BridgePool.DepositData', - name: 'depositData', - type: 'tuple', - }, - { - internalType: 'uint64', - name: 'realizedLpFeePct', - type: 'uint64', - }, - ], - name: 'relayDeposit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - name: 'relays', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'lpTokenAmount', - type: 'uint256', - }, - { - internalType: 'bool', - name: 'sendEth', - type: 'bool', - }, - ], - name: 'removeLiquidity', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'time', - type: 'uint256', - }, - ], - name: 'setCurrentTime', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'chainId', - type: 'uint256', - }, - { - internalType: 'uint64', - name: 'depositId', - type: 'uint64', - }, - { - internalType: 'address payable', - name: 'l1Recipient', - type: 'address', - }, - { - internalType: 'address', - name: 'l2Sender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint64', - name: 'slowRelayFeePct', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'instantRelayFeePct', - type: 'uint64', - }, - { - internalType: 'uint32', - name: 'quoteTimestamp', - type: 'uint32', - }, - ], - internalType: 'struct BridgePool.DepositData', - name: 'depositData', - type: 'tuple', - }, - { - components: [ - { - internalType: 'enum BridgePool.RelayState', - name: 'relayState', - type: 'uint8', - }, - { - internalType: 'address', - name: 'slowRelayer', - type: 'address', - }, - { - internalType: 'uint32', - name: 'relayId', - type: 'uint32', - }, - { - internalType: 'uint64', - name: 'realizedLpFeePct', - type: 'uint64', - }, - { - internalType: 'uint32', - name: 'priceRequestTime', - type: 'uint32', - }, - { - internalType: 'uint256', - name: 'proposerBond', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'finalFee', - type: 'uint256', - }, - ], - internalType: 'struct BridgePool.RelayData', - name: 'relayData', - type: 'tuple', - }, - ], - name: 'settleRelay', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'chainId', - type: 'uint256', - }, - { - internalType: 'uint64', - name: 'depositId', - type: 'uint64', - }, - { - internalType: 'address payable', - name: 'l1Recipient', - type: 'address', - }, - { - internalType: 'address', - name: 'l2Sender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint64', - name: 'slowRelayFeePct', - type: 'uint64', - }, - { - internalType: 'uint64', - name: 'instantRelayFeePct', - type: 'uint64', - }, - { - internalType: 'uint32', - name: 'quoteTimestamp', - type: 'uint32', - }, - ], - internalType: 'struct BridgePool.DepositData', - name: 'depositData', - type: 'tuple', - }, - { - components: [ - { - internalType: 'enum BridgePool.RelayState', - name: 'relayState', - type: 'uint8', - }, - { - internalType: 'address', - name: 'slowRelayer', - type: 'address', - }, - { - internalType: 'uint32', - name: 'relayId', - type: 'uint32', - }, - { - internalType: 'uint64', - name: 'realizedLpFeePct', - type: 'uint64', - }, - { - internalType: 'uint32', - name: 'priceRequestTime', - type: 'uint32', - }, - { - internalType: 'uint256', - name: 'proposerBond', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'finalFee', - type: 'uint256', - }, - ], - internalType: 'struct BridgePool.RelayData', - name: 'relayData', - type: 'tuple', - }, - ], - name: 'speedUpRelay', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'store', - outputs: [ - { - internalType: 'contract StoreInterface', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'sync', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'syncUmaEcosystemParams', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'syncWithBridgeAdminParams', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'timerAddress', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'undistributedLpFees', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'utilizedReserves', - outputs: [ - { - internalType: 'int256', - name: '', - type: 'int256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - stateMutability: 'payable', - type: 'receive', - }, -] as const; - -export type AcrossPoolV1 = typeof acrossPoolV1Abi; -export type AcrossPoolV1Contract = GetContractReturnType; - -export class AcrossPoolV1__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: acrossPoolV1Abi, publicClient: client }); - } -} diff --git a/src/apps/across/contracts/viem/index.ts b/src/apps/across/contracts/viem/index.ts index 82ebb01f7..d486dbf82 100644 --- a/src/apps/across/contracts/viem/index.ts +++ b/src/apps/across/contracts/viem/index.ts @@ -3,11 +3,9 @@ /* eslint-disable */ export type { AcrossHubPoolV2 } from './AcrossHubPoolV2'; -export type { AcrossPoolV1 } from './AcrossPoolV1'; export type { AcrossPoolV2 } from './AcrossPoolV2'; export type { AcrossStaking } from './AcrossStaking'; export { AcrossHubPoolV2__factory } from './AcrossHubPoolV2'; -export { AcrossPoolV1__factory } from './AcrossPoolV1'; export { AcrossPoolV2__factory } from './AcrossPoolV2'; export { AcrossStaking__factory } from './AcrossStaking'; diff --git a/src/apps/across/ethereum/across.pool-v1.token-fetcher.ts b/src/apps/across/ethereum/across.pool-v1.token-fetcher.ts deleted file mode 100644 index 10603b4e8..000000000 --- a/src/apps/across/ethereum/across.pool-v1.token-fetcher.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { AcrossPoolV1TokenFetcher } from '../common/across.pool-v1.token-fetcher'; - -@PositionTemplate() -export class EthereumAcrossPoolV1TokenFetcher extends AcrossPoolV1TokenFetcher { - groupLabel = 'Pools'; - - poolAddresses = [ - '0x43298f9f91a4545df64748e78a2c777c580573d6', // BADGER - '0x4841572daa1f8e4ce0f62570877c2d0cc18c9535', // BOBA - '0x43f133fe6fdfa17c417695c476447dc2a449ba5b', // DAI - '0xdfe0ec39291e3b60aca122908f86809c9ee64e90', // UMA - '0x256c8919ce1ab0e33974cf6aa9c71561ef3017b6', // USDC - '0x02fbb64517e1c6ed69a6faa3abf37db0482f1152', // WBTC - '0x7355efc63ae731f584380a9838292c7046c1e433', // WETH - ]; -} diff --git a/src/apps/alpha-v1/alpha-v1.module.ts b/src/apps/alpha-v1/alpha-v1.module.ts deleted file mode 100644 index 4f484c05f..000000000 --- a/src/apps/alpha-v1/alpha-v1.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { AbstractApp } from '~app/app.dynamic-module'; - -import { AlphaV1ViemContractFactory } from './contracts'; -import { EthereumAlphaV1LendingTokenFetcher } from './ethereum/alpha-v1.lending.token-fetcher'; - -@Module({ - providers: [AlphaV1ViemContractFactory, EthereumAlphaV1LendingTokenFetcher], -}) -export class AlphaV1AppModule extends AbstractApp() {} diff --git a/src/apps/alpha-v1/assets/logo.png b/src/apps/alpha-v1/assets/logo.png deleted file mode 100644 index c89da9cad3bce0969bb4af53e9dab84c6d237eab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31307 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 diff --git a/src/apps/alpha-v1/contracts/abis/alpha-bank.json b/src/apps/alpha-v1/contracts/abis/alpha-bank.json deleted file mode 100644 index 183752bc2..000000000 --- a/src/apps/alpha-v1/contracts/abis/alpha-bank.json +++ /dev/null @@ -1,846 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "contract BankConfig", - "name": "_config", - "type": "address" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "debtShare", - "type": "uint256" - } - ], - "name": "AddDebt", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "killer", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "prize", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "left", - "type": "uint256" - } - ], - "name": "Kill", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "debtShare", - "type": "uint256" - } - ], - "name": "RemoveDebt", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "loan", - "type": "uint256" - } - ], - "name": "Work", - "type": "event" - }, - { - "payable": true, - "stateMutability": "payable", - "type": "fallback" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "config", - "outputs": [ - { - "internalType": "contract BankConfig", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "debtShare", - "type": "uint256" - } - ], - "name": "debtShareToVal", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "debtVal", - "type": "uint256" - } - ], - "name": "debtValToShare", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "deposit", - "outputs": [], - "payable": true, - "stateMutability": "payable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "glbDebtShare", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "glbDebtVal", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "isOwner", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - } - ], - "name": "kill", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "lastAccrueTime", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "nextPositionID", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "msgValue", - "type": "uint256" - } - ], - "name": "pendingInterest", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - } - ], - "name": "positionInfo", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "positions", - "outputs": [ - { - "internalType": "address", - "name": "goblin", - "type": "address" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "uint256", - "name": "debtShare", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "recover", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "reduceReserve", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "reservePool", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalETH", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "contract BankConfig", - "name": "_config", - "type": "address" - } - ], - "name": "updateConfig", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "share", - "type": "uint256" - } - ], - "name": "withdraw", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "withdrawReserve", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "id", - "type": "uint256" - }, - { - "internalType": "address", - "name": "goblin", - "type": "address" - }, - { - "internalType": "uint256", - "name": "loan", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxReturn", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "work", - "outputs": [], - "payable": true, - "stateMutability": "payable", - "type": "function" - } -] diff --git a/src/apps/alpha-v1/contracts/index.ts b/src/apps/alpha-v1/contracts/index.ts deleted file mode 100644 index 5dcfebdf6..000000000 --- a/src/apps/alpha-v1/contracts/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -export * from './viem.contract-factory'; diff --git a/src/apps/alpha-v1/contracts/viem.contract-factory.ts b/src/apps/alpha-v1/contracts/viem.contract-factory.ts deleted file mode 100644 index 6618edc2b..000000000 --- a/src/apps/alpha-v1/contracts/viem.contract-factory.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable, Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { Network } from '~types/network.interface'; - -import { AlphaBank__factory } from './viem'; - -type ContractOpts = { address: string; network: Network }; - -@Injectable() -export class AlphaV1ViemContractFactory { - constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) {} - - alphaBank({ address, network }: ContractOpts) { - return AlphaBank__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } -} diff --git a/src/apps/alpha-v1/contracts/viem/AlphaBank.ts b/src/apps/alpha-v1/contracts/viem/AlphaBank.ts deleted file mode 100644 index 3f7b81a94..000000000 --- a/src/apps/alpha-v1/contracts/viem/AlphaBank.ts +++ /dev/null @@ -1,860 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const alphaBankAbi = [ - { - inputs: [ - { - internalType: 'contract BankConfig', - name: '_config', - type: 'address', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'id', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'debtShare', - type: 'uint256', - }, - ], - name: 'AddDebt', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'id', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'killer', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'prize', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'left', - type: 'uint256', - }, - ], - name: 'Kill', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'previousOwner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnershipTransferred', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'id', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'debtShare', - type: 'uint256', - }, - ], - name: 'RemoveDebt', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'id', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'loan', - type: 'uint256', - }, - ], - name: 'Work', - type: 'event', - }, - { - payable: true, - stateMutability: 'payable', - type: 'fallback', - }, - { - constant: true, - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'config', - outputs: [ - { - internalType: 'contract BankConfig', - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'uint256', - name: 'debtShare', - type: 'uint256', - }, - ], - name: 'debtShareToVal', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'uint256', - name: 'debtVal', - type: 'uint256', - }, - ], - name: 'debtValToShare', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'subtractedValue', - type: 'uint256', - }, - ], - name: 'decreaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [], - name: 'deposit', - outputs: [], - payable: true, - stateMutability: 'payable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'glbDebtShare', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'glbDebtVal', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'addedValue', - type: 'uint256', - }, - ], - name: 'increaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'isOwner', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'uint256', - name: 'id', - type: 'uint256', - }, - ], - name: 'kill', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'lastAccrueTime', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'nextPositionID', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'owner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'uint256', - name: 'msgValue', - type: 'uint256', - }, - ], - name: 'pendingInterest', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'uint256', - name: 'id', - type: 'uint256', - }, - ], - name: 'positionInfo', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'positions', - outputs: [ - { - internalType: 'address', - name: 'goblin', - type: 'address', - }, - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'uint256', - name: 'debtShare', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'recover', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'reduceReserve', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [], - name: 'renounceOwnership', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'reservePool', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'totalETH', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'transferOwnership', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'contract BankConfig', - name: '_config', - type: 'address', - }, - ], - name: 'updateConfig', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'uint256', - name: 'share', - type: 'uint256', - }, - ], - name: 'withdraw', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'withdrawReserve', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'uint256', - name: 'id', - type: 'uint256', - }, - { - internalType: 'address', - name: 'goblin', - type: 'address', - }, - { - internalType: 'uint256', - name: 'loan', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'maxReturn', - type: 'uint256', - }, - { - internalType: 'bytes', - name: 'data', - type: 'bytes', - }, - ], - name: 'work', - outputs: [], - payable: true, - stateMutability: 'payable', - type: 'function', - }, -] as const; - -export type AlphaBank = typeof alphaBankAbi; -export type AlphaBankContract = GetContractReturnType; - -export class AlphaBank__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: alphaBankAbi, publicClient: client }); - } -} diff --git a/src/apps/alpha-v1/contracts/viem/index.ts b/src/apps/alpha-v1/contracts/viem/index.ts deleted file mode 100644 index 6c7632d18..000000000 --- a/src/apps/alpha-v1/contracts/viem/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ - -export type { AlphaBank } from './AlphaBank'; - -export { AlphaBank__factory } from './AlphaBank'; diff --git a/src/apps/alpha-v1/ethereum/alpha-v1.lending.token-fetcher.ts b/src/apps/alpha-v1/ethereum/alpha-v1.lending.token-fetcher.ts deleted file mode 100644 index 549884dec..000000000 --- a/src/apps/alpha-v1/ethereum/alpha-v1.lending.token-fetcher.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Inject } from '@nestjs/common'; -import { BigNumber } from 'bignumber.js'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { ZERO_ADDRESS } from '~app-toolkit/constants/address'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetDataPropsParams, - DefaultAppTokenDataProps, - GetPricePerShareParams, - DefaultAppTokenDefinition, - GetPriceParams, -} from '~position/template/app-token.template.types'; - -import { AlphaV1ViemContractFactory } from '../contracts'; -import { AlphaBank } from '../contracts/viem'; - -@PositionTemplate() -export class EthereumAlphaV1LendingTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Lending'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(AlphaV1ViemContractFactory) protected readonly contractFactory: AlphaV1ViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.alphaBank({ network: this.network, address }); - } - - async getAddresses(): Promise { - return ['0x67b66c99d3eb37fa76aa3ed1ff33e8e39f0b9c7a']; - } - - async getUnderlyingTokenDefinitions() { - return [{ address: ZERO_ADDRESS, network: this.network }]; - } - - async getPrice({ - appToken, - contract, - }: GetPriceParams): Promise { - const ethPrice = appToken.tokens[0].price; - const [totalEthRaw, totalSupplyRaw] = await Promise.all([contract.read.totalETH(), contract.read.totalSupply()]); - - return (ethPrice * Number(totalEthRaw)) / Number(totalSupplyRaw); - } - - async getPricePerShare({ contract }: GetPricePerShareParams) { - const [totalEthRaw, totalSupplyRaw] = await Promise.all([contract.read.totalETH(), contract.read.totalSupply()]); - return [Number(totalEthRaw) / Number(totalSupplyRaw)]; - } - - async getLiquidity({ appToken }: GetDataPropsParams) { - return appToken.supply * appToken.price; - } - - async getReserves({ appToken, contract }: GetDataPropsParams) { - const totalEthRaw = await contract.read.totalETH(); - return [Number(totalEthRaw) / 10 ** appToken.tokens[0].decimals]; - } - - async getApy({ contract }: GetDataPropsParams) { - const [totalEthRaw, totalDebtValueRaw] = await Promise.all([contract.read.totalETH(), contract.read.glbDebtVal()]); - const utilizationRate = new BigNumber(totalDebtValueRaw.toString()).div(totalEthRaw.toString()); - - const tripleSlope = utilizationRate.lt(new BigNumber(0.8)) - ? utilizationRate.times(new BigNumber(0.1)).div(new BigNumber(0.8)) - : utilizationRate.lt(new BigNumber(0.9)) - ? new BigNumber(0.1) - : new BigNumber(0.1).plus( - utilizationRate.minus(new BigNumber(0.9)).times(new BigNumber(0.4)).div(new BigNumber(0.1)), - ); - - return tripleSlope.times(utilizationRate).times(0.9).toNumber(); - } -} diff --git a/src/apps/aura/aura.module.ts b/src/apps/aura/aura.module.ts index e89024722..2667bf047 100644 --- a/src/apps/aura/aura.module.ts +++ b/src/apps/aura/aura.module.ts @@ -15,7 +15,6 @@ import { EthereumAuraChefContractPositionFetcher } from './ethereum/aura.chef.co import { EthereumAuraDepositTokenFetcher } from './ethereum/aura.deposit.token-fetcher'; import { EthereumAuraLockerContractPositionFetcher } from './ethereum/aura.locker.contract-position-fetcher'; import { EthereumAuraLpFarmContractPositionFetcher } from './ethereum/aura.lp-farm.contract-position-fetcher'; -import { EthereumAuraStakedAuraBalTokenFetcher } from './ethereum/aura.staked-aura-bal.token-fetcher'; import { OptimismAuraDepositTokenFetcher } from './optimism/aura.deposit.token-fetcher'; import { OptimismAuraLpFarmContractPositionFetcher } from './optimism/aura.lp-farm.contract-position-fetcher'; @@ -37,7 +36,6 @@ import { OptimismAuraLpFarmContractPositionFetcher } from './optimism/aura.lp-fa EthereumAuraLpFarmContractPositionFetcher, EthereumAuraLockerContractPositionFetcher, EthereumAuraAuraBalStakingContractPositionFetcher, - EthereumAuraStakedAuraBalTokenFetcher, EthereumAuraAuraBalCompounderContractPositionFetcher, // Optimism OptimismAuraDepositTokenFetcher, diff --git a/src/apps/aura/contracts/abis/aura-bal-staking-token.json b/src/apps/aura/contracts/abis/aura-bal-staking-token.json deleted file mode 100644 index 0d0804393..000000000 --- a/src/apps/aura/contracts/abis/aura-bal-staking-token.json +++ /dev/null @@ -1,479 +0,0 @@ -[ - { - "inputs": [ - { "internalType": "address", "name": "_token", "type": "address" }, - { "internalType": "address", "name": "_virtualRewardFactory", "type": "address" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256", "name": "_incentive", "type": "uint256" }], - "name": "CallerIncentiveUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "assets", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "shares", "type": "uint256" } - ], - "name": "Deposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "_reward", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "extraReward", "type": "address" } - ], - "name": "ExtraRewardAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": true, "internalType": "address", "name": "_reward", "type": "address" }], - "name": "ExtraRewardCleared", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "_caller", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "_value", "type": "uint256" } - ], - "name": "Harvest", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": true, "internalType": "address", "name": "_strategy", "type": "address" }], - "name": "StrategySet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "receiver", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "assets", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "shares", "type": "uint256" } - ], - "name": "Withdraw", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256", "name": "_penalty", "type": "uint256" }], - "name": "WithdrawalPenaltyUpdated", - "type": "event" - }, - { - "inputs": [], - "name": "FEE_DENOMINATOR", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_WITHDRAWAL_PENALTY", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_reward", "type": "address" }], - "name": "addExtraReward", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "asset", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "authorizedHarvesters", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "user", "type": "address" }], - "name": "balanceOfUnderlying", - "outputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { "inputs": [], "name": "clearExtraRewards", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [{ "internalType": "uint256", "name": "_shares", "type": "uint256" }], - "name": "convertToAssets", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_assets", "type": "uint256" }], - "name": "convertToShares", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "subtractedValue", "type": "uint256" } - ], - "name": "decreaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "_amount", "type": "uint256" }, - { "internalType": "address", "name": "_receiver", "type": "address" } - ], - "name": "deposit", - "outputs": [{ "internalType": "uint256", "name": "_shares", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "name": "extraRewards", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "extraRewardsLength", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { "inputs": [], "name": "harvest", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [{ "internalType": "uint256", "name": "_minAmountOut", "type": "uint256" }], - "name": "harvest", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "addedValue", "type": "uint256" } - ], - "name": "increaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "isExtraReward", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "isHarvestPermissioned", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "maxDeposit", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "maxMint", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_owner", "type": "address" }], - "name": "maxRedeem", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_owner", "type": "address" }], - "name": "maxWithdraw", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "_shares", "type": "uint256" }, - { "internalType": "address", "name": "_receiver", "type": "address" } - ], - "name": "mint", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_assets", "type": "uint256" }], - "name": "previewDeposit", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_shares", "type": "uint256" }], - "name": "previewMint", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_shares", "type": "uint256" }], - "name": "previewRedeem", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_assets", "type": "uint256" }], - "name": "previewWithdraw", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "_shares", "type": "uint256" }, - { "internalType": "address", "name": "_receiver", "type": "address" }, - { "internalType": "address", "name": "_owner", "type": "address" } - ], - "name": "redeem", - "outputs": [{ "internalType": "uint256", "name": "withdrawn", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [{ "internalType": "bool", "name": "_status", "type": "bool" }], - "name": "setHarvestPermissions", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_strategy", "type": "address" }], - "name": "setStrategy", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_penalty", "type": "uint256" }], - "name": "setWithdrawalPenalty", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "strategy", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalAssets", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalUnderlying", - "outputs": [{ "internalType": "uint256", "name": "total", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "underlying", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_harvester", "type": "address" }, - { "internalType": "bool", "name": "_authorized", "type": "bool" } - ], - "name": "updateAuthorizedHarvesters", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "virtualRewardFactory", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "_assets", "type": "uint256" }, - { "internalType": "address", "name": "_receiver", "type": "address" }, - { "internalType": "address", "name": "_owner", "type": "address" } - ], - "name": "withdraw", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "withdrawalPenalty", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - } -] diff --git a/src/apps/aura/contracts/viem.contract-factory.ts b/src/apps/aura/contracts/viem.contract-factory.ts index 7f2b259b1..31d1e69a1 100644 --- a/src/apps/aura/contracts/viem.contract-factory.ts +++ b/src/apps/aura/contracts/viem.contract-factory.ts @@ -4,7 +4,6 @@ import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; import { Network } from '~types/network.interface'; import { - AuraBalStakingToken__factory, AuraBalToken__factory, AuraBalVirtualRewardPool__factory, AuraBalancerHelpers__factory, @@ -25,9 +24,6 @@ type ContractOpts = { address: string; network: Network }; export class AuraViemContractFactory { constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) {} - auraBalStakingToken({ address, network }: ContractOpts) { - return AuraBalStakingToken__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } auraBalToken({ address, network }: ContractOpts) { return AuraBalToken__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } diff --git a/src/apps/aura/contracts/viem/AuraBalStakingToken.ts b/src/apps/aura/contracts/viem/AuraBalStakingToken.ts deleted file mode 100644 index 1b107d9d3..000000000 --- a/src/apps/aura/contracts/viem/AuraBalStakingToken.ts +++ /dev/null @@ -1,1130 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const auraBalStakingTokenAbi = [ - { - inputs: [ - { - internalType: 'address', - name: '_token', - type: 'address', - }, - { - internalType: 'address', - name: '_virtualRewardFactory', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: '_incentive', - type: 'uint256', - }, - ], - name: 'CallerIncentiveUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'Deposit', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: '_reward', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: 'extraReward', - type: 'address', - }, - ], - name: 'ExtraRewardAdded', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: '_reward', - type: 'address', - }, - ], - name: 'ExtraRewardCleared', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: '_caller', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: '_value', - type: 'uint256', - }, - ], - name: 'Harvest', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'previousOwner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnershipTransferred', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: '_strategy', - type: 'address', - }, - ], - name: 'StrategySet', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'Withdraw', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: '_penalty', - type: 'uint256', - }, - ], - name: 'WithdrawalPenaltyUpdated', - type: 'event', - }, - { - inputs: [], - name: 'FEE_DENOMINATOR', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'MAX_WITHDRAWAL_PENALTY', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_reward', - type: 'address', - }, - ], - name: 'addExtraReward', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'asset', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'authorizedHarvesters', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - ], - name: 'balanceOfUnderlying', - outputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'clearExtraRewards', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_shares', - type: 'uint256', - }, - ], - name: 'convertToAssets', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_assets', - type: 'uint256', - }, - ], - name: 'convertToShares', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'subtractedValue', - type: 'uint256', - }, - ], - name: 'decreaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - { - internalType: 'address', - name: '_receiver', - type: 'address', - }, - ], - name: 'deposit', - outputs: [ - { - internalType: 'uint256', - name: '_shares', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'extraRewards', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'extraRewardsLength', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'harvest', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_minAmountOut', - type: 'uint256', - }, - ], - name: 'harvest', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'addedValue', - type: 'uint256', - }, - ], - name: 'increaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'isExtraReward', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'isHarvestPermissioned', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'maxDeposit', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'pure', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'maxMint', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'pure', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_owner', - type: 'address', - }, - ], - name: 'maxRedeem', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_owner', - type: 'address', - }, - ], - name: 'maxWithdraw', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_shares', - type: 'uint256', - }, - { - internalType: 'address', - name: '_receiver', - type: 'address', - }, - ], - name: 'mint', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'owner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_assets', - type: 'uint256', - }, - ], - name: 'previewDeposit', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_shares', - type: 'uint256', - }, - ], - name: 'previewMint', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_shares', - type: 'uint256', - }, - ], - name: 'previewRedeem', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_assets', - type: 'uint256', - }, - ], - name: 'previewWithdraw', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_shares', - type: 'uint256', - }, - { - internalType: 'address', - name: '_receiver', - type: 'address', - }, - { - internalType: 'address', - name: '_owner', - type: 'address', - }, - ], - name: 'redeem', - outputs: [ - { - internalType: 'uint256', - name: 'withdrawn', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'renounceOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bool', - name: '_status', - type: 'bool', - }, - ], - name: 'setHarvestPermissions', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_strategy', - type: 'address', - }, - ], - name: 'setStrategy', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_penalty', - type: 'uint256', - }, - ], - name: 'setWithdrawalPenalty', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'strategy', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalAssets', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalUnderlying', - outputs: [ - { - internalType: 'uint256', - name: 'total', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'transferOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'underlying', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_harvester', - type: 'address', - }, - { - internalType: 'bool', - name: '_authorized', - type: 'bool', - }, - ], - name: 'updateAuthorizedHarvesters', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'virtualRewardFactory', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_assets', - type: 'uint256', - }, - { - internalType: 'address', - name: '_receiver', - type: 'address', - }, - { - internalType: 'address', - name: '_owner', - type: 'address', - }, - ], - name: 'withdraw', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'withdrawalPenalty', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, -] as const; - -export type AuraBalStakingToken = typeof auraBalStakingTokenAbi; -export type AuraBalStakingTokenContract = GetContractReturnType; - -export class AuraBalStakingToken__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: auraBalStakingTokenAbi, publicClient: client }); - } -} diff --git a/src/apps/aura/contracts/viem/index.ts b/src/apps/aura/contracts/viem/index.ts index 679d51082..f0c3457f1 100644 --- a/src/apps/aura/contracts/viem/index.ts +++ b/src/apps/aura/contracts/viem/index.ts @@ -2,7 +2,6 @@ /* tslint:disable */ /* eslint-disable */ -export type { AuraBalStakingToken } from './AuraBalStakingToken'; export type { AuraBalToken } from './AuraBalToken'; export type { AuraBalVirtualRewardPool } from './AuraBalVirtualRewardPool'; export type { AuraBalancerHelpers } from './AuraBalancerHelpers'; @@ -16,7 +15,6 @@ export type { AuraStashToken } from './AuraStashToken'; export type { AuraToken } from './AuraToken'; export type { AuraVirtualBalanceRewardPool } from './AuraVirtualBalanceRewardPool'; -export { AuraBalStakingToken__factory } from './AuraBalStakingToken'; export { AuraBalToken__factory } from './AuraBalToken'; export { AuraBalVirtualRewardPool__factory } from './AuraBalVirtualRewardPool'; export { AuraBalancerHelpers__factory } from './AuraBalancerHelpers'; diff --git a/src/apps/aura/ethereum/aura.staked-aura-bal.token-fetcher.ts b/src/apps/aura/ethereum/aura.staked-aura-bal.token-fetcher.ts deleted file mode 100644 index 8067f7b57..000000000 --- a/src/apps/aura/ethereum/aura.staked-aura-bal.token-fetcher.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Inject } from '@nestjs/common'; -import { BigNumber } from 'ethers'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { getLabelFromToken } from '~app-toolkit/helpers/presentation/image.present'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetUnderlyingTokensParams, - GetDisplayPropsParams, - GetPricePerShareParams, -} from '~position/template/app-token.template.types'; - -import { AuraViemContractFactory } from '../contracts'; -import { AuraBalStakingToken } from '../contracts/viem/AuraBalStakingToken'; - -@PositionTemplate() -export class EthereumAuraStakedAuraBalTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Staked Aura BAL'; - - isExcludedFromBalances = true; - isExcludedFromExplore = true; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(AuraViemContractFactory) protected readonly contractFactory: AuraViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.auraBalStakingToken({ address, network: this.network }); - } - - async getAddresses() { - return ['0xfaa2ed111b4f580fcb85c48e6dc6782dc5fcd7a6']; - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.asset(), network: this.network }]; - } - - async getPricePerShare({ appToken, contract }: GetPricePerShareParams) { - const amount = BigNumber.from((1e18).toString()).toString(); - const ratioRaw = await contract.read.convertToAssets([BigInt(amount)]); - const ratio = Number(ratioRaw) / 10 ** appToken.decimals; - return [ratio]; - } - - async getLabel({ appToken }: GetDisplayPropsParams) { - return getLabelFromToken(appToken.tokens[0]!); - } -} diff --git a/src/apps/balancer-v2/balancer-v2.module.ts b/src/apps/balancer-v2/balancer-v2.module.ts index ce36890c3..4afce1b17 100644 --- a/src/apps/balancer-v2/balancer-v2.module.ts +++ b/src/apps/balancer-v2/balancer-v2.module.ts @@ -16,14 +16,12 @@ import { EthereumBalancerV2FarmContractPositionFetcher } from './ethereum/balanc import { EthereumBalancerV2PoolTokenFetcher } from './ethereum/balancer-v2.pool.token-fetcher'; import { EthereumBalancerV2VeBalRewardsContractPositionFetcher } from './ethereum/balancer-v2.ve-bal-rewards.contract-position-fetcher'; import { EthereumBalancerV2VotingEscrowContractPositionFetcher } from './ethereum/balancer-v2.voting-escrow.contract-position-fetcher'; -import { EthereumBalancerV2WrappedAaveTokenFetcher } from './ethereum/balancer-v2.wrapped-aave.token-fetcher'; import { GnosisBalancerV2BoostedTokenFetcher } from './gnosis/balancer-v2.boosted.token-fetcher'; import { GnosisBalancerV2FarmContractPositionFetcher } from './gnosis/balancer-v2.farm.contract-position-fetcher'; import { GnosisBalancerV2PoolTokenFetcher } from './gnosis/balancer-v2.pool.token-fetcher'; import { PolygonBalancerV2BoostedTokenFetcher } from './polygon/balancer-v2.boosted.token-fetcher'; import { PolygonBalancerV2FarmContractPositionFetcher } from './polygon/balancer-v2.farm.contract-position-fetcher'; import { PolygonBalancerV2PoolTokenFetcher } from './polygon/balancer-v2.pool.token-fetcher'; -import { PolygonBalancerV2StaticYieldTokenFetcher } from './polygon/balancer-v2.static-yield.token-fetcher'; @Module({ providers: [ @@ -44,7 +42,6 @@ import { PolygonBalancerV2StaticYieldTokenFetcher } from './polygon/balancer-v2. EthereumBalancerV2PoolTokenFetcher, EthereumBalancerV2VotingEscrowContractPositionFetcher, EthereumBalancerV2FarmContractPositionFetcher, - EthereumBalancerV2WrappedAaveTokenFetcher, EthereumBalancerV2VeBalRewardsContractPositionFetcher, // Gnosis GnosisBalancerV2BoostedTokenFetcher, @@ -54,7 +51,6 @@ import { PolygonBalancerV2StaticYieldTokenFetcher } from './polygon/balancer-v2. PolygonBalancerV2BoostedTokenFetcher, PolygonBalancerV2PoolTokenFetcher, PolygonBalancerV2FarmContractPositionFetcher, - PolygonBalancerV2StaticYieldTokenFetcher, ], }) export class BalancerV2AppModule extends AbstractApp() {} diff --git a/src/apps/balancer-v2/common/balancer-v2.static-yield.token-fetcher.ts b/src/apps/balancer-v2/common/balancer-v2.static-yield.token-fetcher.ts deleted file mode 100644 index 58e40a2f6..000000000 --- a/src/apps/balancer-v2/common/balancer-v2.static-yield.token-fetcher.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetUnderlyingTokensParams } from '~position/template/app-token.template.types'; - -import { BalancerV2ViemContractFactory } from '../contracts'; -import { BalancerStaticAToken } from '../contracts/viem/BalancerStaticAToken'; - -export abstract class BalancerV2StaticYieldTokenFetcher extends AppTokenTemplatePositionFetcher { - abstract staticYieldTokenAddresses: string[]; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(BalancerV2ViemContractFactory) protected readonly contractFactory: BalancerV2ViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.balancerStaticAToken({ address, network: this.network }); - } - - async getAddresses() { - return this.staticYieldTokenAddresses; - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.simulate.ATOKEN().then(v => v.result), network: this.network }]; - } - - async getPricePerShare() { - return [1]; - } -} diff --git a/src/apps/balancer-v2/contracts/abis/balancer-static-a-token.json b/src/apps/balancer-v2/contracts/abis/balancer-static-a-token.json deleted file mode 100644 index 82fa34055..000000000 --- a/src/apps/balancer-v2/contracts/abis/balancer-static-a-token.json +++ /dev/null @@ -1,629 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [], - "name": "ASSET", - "outputs": [ - { - "internalType": "contract IERC20", - "name": "", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "ATOKEN", - "outputs": [ - { - "internalType": "contract IERC20", - "name": "", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "LENDING_POOL", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "_nonces", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint16", - "name": "referralCode", - "type": "uint16" - }, - { - "internalType": "bool", - "name": "fromUnderlying", - "type": "bool" - } - ], - "name": "deposit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "dynamicBalanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "dynamicToStaticAmount", - "outputs": [ - { - "internalType": "uint256", - "name": "staticAmount", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "name": "getDomainSeparator", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "depositor", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint16", - "name": "referralCode", - "type": "uint16" - }, - { - "internalType": "bool", - "name": "fromUnderlying", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "internalType": "struct IStaticAToken.SignatureParams", - "name": "sigParams", - "type": "tuple" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "name": "metaDeposit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "staticAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "dynamicAmount", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "toUnderlying", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "internalType": "struct IStaticAToken.SignatureParams", - "name": "sigParams", - "type": "tuple" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "name": "metaWithdraw", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rate", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "staticToDynamicAmount", - "outputs": [ - { - "internalType": "uint256", - "name": "dynamicAmount", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "toUnderlying", - "type": "bool" - } - ], - "name": "withdraw", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "toUnderlying", - "type": "bool" - } - ], - "name": "withdrawDynamicAmount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/balancer-v2/contracts/abis/balancer-wrapped-aave-token.json b/src/apps/balancer-v2/contracts/abis/balancer-wrapped-aave-token.json deleted file mode 100644 index e460a5cdb..000000000 --- a/src/apps/balancer-v2/contracts/abis/balancer-wrapped-aave-token.json +++ /dev/null @@ -1,465 +0,0 @@ -[ - { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "pool", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "aToken", "type": "address" }, - { "indexed": false, "internalType": "string", "name": "staticATokenName", "type": "string" }, - { "indexed": false, "internalType": "string", "name": "staticATokenSymbol", "type": "string" } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [], - "name": "ASSET", - "outputs": [{ "internalType": "contract IERC20", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ATOKEN", - "outputs": [{ "internalType": "contract IERC20", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "EIP712_REVISION", - "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INCENTIVES_CONTROLLER", - "outputs": [{ "internalType": "contract IAaveIncentivesController", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "LENDING_POOL", - "outputs": [{ "internalType": "contract ILendingPool", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "METADEPOSIT_TYPEHASH", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "METAWITHDRAWAL_TYPEHASH", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PERMIT_TYPEHASH", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "REWARD_TOKEN", - "outputs": [{ "internalType": "contract IERC20", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "STATIC_ATOKEN_LM_REVISION", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "UNDERLYING_ASSET_ADDRESS", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "_nonces", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "receiver", "type": "address" }, - { "internalType": "bool", "name": "forceUpdate", "type": "bool" } - ], - "name": "claimRewards", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "onBehalfOf", "type": "address" }, - { "internalType": "address", "name": "receiver", "type": "address" }, - { "internalType": "bool", "name": "forceUpdate", "type": "bool" } - ], - "name": "claimRewardsOnBehalf", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "bool", "name": "forceUpdate", "type": "bool" }], - "name": "claimRewardsToSelf", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "collectAndUpdateRewards", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "subtractedValue", "type": "uint256" } - ], - "name": "decreaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" }, - { "internalType": "uint16", "name": "referralCode", "type": "uint16" }, - { "internalType": "bool", "name": "fromUnderlying", "type": "bool" } - ], - "name": "deposit", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], - "name": "dynamicBalanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "dynamicToStaticAmount", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getAccRewardsPerToken", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "user", "type": "address" }], - "name": "getClaimableRewards", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getDomainSeparator", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getIncentivesController", - "outputs": [{ "internalType": "contract IAaveIncentivesController", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLastRewardBlock", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLifetimeRewards", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLifetimeRewardsClaimed", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTotalClaimableRewards", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "user", "type": "address" }], - "name": "getUnclaimedRewards", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "addedValue", "type": "uint256" } - ], - "name": "increaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "contract ILendingPool", "name": "pool", "type": "address" }, - { "internalType": "address", "name": "aToken", "type": "address" }, - { "internalType": "string", "name": "staticATokenName", "type": "string" }, - { "internalType": "string", "name": "staticATokenSymbol", "type": "string" } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "isImplementation", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "depositor", "type": "address" }, - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" }, - { "internalType": "uint16", "name": "referralCode", "type": "uint16" }, - { "internalType": "bool", "name": "fromUnderlying", "type": "bool" }, - { "internalType": "uint256", "name": "deadline", "type": "uint256" }, - { - "components": [ - { "internalType": "uint8", "name": "v", "type": "uint8" }, - { "internalType": "bytes32", "name": "r", "type": "bytes32" }, - { "internalType": "bytes32", "name": "s", "type": "bytes32" } - ], - "internalType": "struct IStaticATokenLM.SignatureParams", - "name": "sigParams", - "type": "tuple" - } - ], - "name": "metaDeposit", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "staticAmount", "type": "uint256" }, - { "internalType": "uint256", "name": "dynamicAmount", "type": "uint256" }, - { "internalType": "bool", "name": "toUnderlying", "type": "bool" }, - { "internalType": "uint256", "name": "deadline", "type": "uint256" }, - { - "components": [ - { "internalType": "uint8", "name": "v", "type": "uint8" }, - { "internalType": "bytes32", "name": "r", "type": "bytes32" }, - { "internalType": "bytes32", "name": "s", "type": "bytes32" } - ], - "internalType": "struct IStaticATokenLM.SignatureParams", - "name": "sigParams", - "type": "tuple" - } - ], - "name": "metaWithdraw", - "outputs": [ - { "internalType": "uint256", "name": "", "type": "uint256" }, - { "internalType": "uint256", "name": "", "type": "uint256" } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" }, - { "internalType": "uint256", "name": "deadline", "type": "uint256" }, - { "internalType": "uint8", "name": "v", "type": "uint8" }, - { "internalType": "bytes32", "name": "r", "type": "bytes32" }, - { "internalType": "bytes32", "name": "s", "type": "bytes32" } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rate", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "staticToDynamicAmount", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" }, - { "internalType": "bool", "name": "toUnderlying", "type": "bool" } - ], - "name": "withdraw", - "outputs": [ - { "internalType": "uint256", "name": "", "type": "uint256" }, - { "internalType": "uint256", "name": "", "type": "uint256" } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" }, - { "internalType": "bool", "name": "toUnderlying", "type": "bool" } - ], - "name": "withdrawDynamicAmount", - "outputs": [ - { "internalType": "uint256", "name": "", "type": "uint256" }, - { "internalType": "uint256", "name": "", "type": "uint256" } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/balancer-v2/contracts/viem.contract-factory.ts b/src/apps/balancer-v2/contracts/viem.contract-factory.ts index c43ce26e4..9e8b54e87 100644 --- a/src/apps/balancer-v2/contracts/viem.contract-factory.ts +++ b/src/apps/balancer-v2/contracts/viem.contract-factory.ts @@ -14,10 +14,8 @@ import { BalancerMerkleRedeem__factory, BalancerPool__factory, BalancerStablePhantomPool__factory, - BalancerStaticAToken__factory, BalancerVault__factory, BalancerVeBal__factory, - BalancerWrappedAaveToken__factory, } from './viem'; type ContractOpts = { address: string; network: Network }; @@ -56,16 +54,10 @@ export class BalancerV2ViemContractFactory { balancerStablePhantomPool({ address, network }: ContractOpts) { return BalancerStablePhantomPool__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } - balancerStaticAToken({ address, network }: ContractOpts) { - return BalancerStaticAToken__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } balancerVault({ address, network }: ContractOpts) { return BalancerVault__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } balancerVeBal({ address, network }: ContractOpts) { return BalancerVeBal__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } - balancerWrappedAaveToken({ address, network }: ContractOpts) { - return BalancerWrappedAaveToken__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } } diff --git a/src/apps/balancer-v2/contracts/viem/BalancerStaticAToken.ts b/src/apps/balancer-v2/contracts/viem/BalancerStaticAToken.ts deleted file mode 100644 index 2c536f620..000000000 --- a/src/apps/balancer-v2/contracts/viem/BalancerStaticAToken.ts +++ /dev/null @@ -1,643 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const balancerStaticATokenAbi = [ - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - inputs: [], - name: 'ASSET', - outputs: [ - { - internalType: 'contract IERC20', - name: '', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'ATOKEN', - outputs: [ - { - internalType: 'contract IERC20', - name: '', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'LENDING_POOL', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: '_nonces', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint16', - name: 'referralCode', - type: 'uint16', - }, - { - internalType: 'bool', - name: 'fromUnderlying', - type: 'bool', - }, - ], - name: 'deposit', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'dynamicBalanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'dynamicToStaticAmount', - outputs: [ - { - internalType: 'uint256', - name: 'staticAmount', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'chainId', - type: 'uint256', - }, - ], - name: 'getDomainSeparator', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'depositor', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - internalType: 'uint16', - name: 'referralCode', - type: 'uint16', - }, - { - internalType: 'bool', - name: 'fromUnderlying', - type: 'bool', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - { - components: [ - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - ], - internalType: 'struct IStaticAToken.SignatureParams', - name: 'sigParams', - type: 'tuple', - }, - { - internalType: 'uint256', - name: 'chainId', - type: 'uint256', - }, - ], - name: 'metaDeposit', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'staticAmount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'dynamicAmount', - type: 'uint256', - }, - { - internalType: 'bool', - name: 'toUnderlying', - type: 'bool', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - { - components: [ - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - ], - internalType: 'struct IStaticAToken.SignatureParams', - name: 'sigParams', - type: 'tuple', - }, - { - internalType: 'uint256', - name: 'chainId', - type: 'uint256', - }, - ], - name: 'metaWithdraw', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - { - internalType: 'uint256', - name: 'chainId', - type: 'uint256', - }, - ], - name: 'permit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'rate', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'staticToDynamicAmount', - outputs: [ - { - internalType: 'uint256', - name: 'dynamicAmount', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'bool', - name: 'toUnderlying', - type: 'bool', - }, - ], - name: 'withdraw', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'bool', - name: 'toUnderlying', - type: 'bool', - }, - ], - name: 'withdrawDynamicAmount', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type BalancerStaticAToken = typeof balancerStaticATokenAbi; -export type BalancerStaticATokenContract = GetContractReturnType; - -export class BalancerStaticAToken__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: balancerStaticATokenAbi, publicClient: client }); - } -} diff --git a/src/apps/balancer-v2/contracts/viem/BalancerWrappedAaveToken.ts b/src/apps/balancer-v2/contracts/viem/BalancerWrappedAaveToken.ts deleted file mode 100644 index b499c637e..000000000 --- a/src/apps/balancer-v2/contracts/viem/BalancerWrappedAaveToken.ts +++ /dev/null @@ -1,1067 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const balancerWrappedAaveTokenAbi = [ - { - inputs: [], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'pool', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: 'aToken', - type: 'address', - }, - { - indexed: false, - internalType: 'string', - name: 'staticATokenName', - type: 'string', - }, - { - indexed: false, - internalType: 'string', - name: 'staticATokenSymbol', - type: 'string', - }, - ], - name: 'Initialized', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - inputs: [], - name: 'ASSET', - outputs: [ - { - internalType: 'contract IERC20', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'ATOKEN', - outputs: [ - { - internalType: 'contract IERC20', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'EIP712_REVISION', - outputs: [ - { - internalType: 'bytes', - name: '', - type: 'bytes', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'INCENTIVES_CONTROLLER', - outputs: [ - { - internalType: 'contract IAaveIncentivesController', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'LENDING_POOL', - outputs: [ - { - internalType: 'contract ILendingPool', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'METADEPOSIT_TYPEHASH', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'METAWITHDRAWAL_TYPEHASH', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'PERMIT_TYPEHASH', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'REWARD_TOKEN', - outputs: [ - { - internalType: 'contract IERC20', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'STATIC_ATOKEN_LM_REVISION', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'UNDERLYING_ASSET_ADDRESS', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: '_nonces', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - internalType: 'bool', - name: 'forceUpdate', - type: 'bool', - }, - ], - name: 'claimRewards', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'onBehalfOf', - type: 'address', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - internalType: 'bool', - name: 'forceUpdate', - type: 'bool', - }, - ], - name: 'claimRewardsOnBehalf', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bool', - name: 'forceUpdate', - type: 'bool', - }, - ], - name: 'claimRewardsToSelf', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'collectAndUpdateRewards', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'subtractedValue', - type: 'uint256', - }, - ], - name: 'decreaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint16', - name: 'referralCode', - type: 'uint16', - }, - { - internalType: 'bool', - name: 'fromUnderlying', - type: 'bool', - }, - ], - name: 'deposit', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'dynamicBalanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'dynamicToStaticAmount', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getAccRewardsPerToken', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - ], - name: 'getClaimableRewards', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getDomainSeparator', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getIncentivesController', - outputs: [ - { - internalType: 'contract IAaveIncentivesController', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getLastRewardBlock', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getLifetimeRewards', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getLifetimeRewardsClaimed', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getTotalClaimableRewards', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - ], - name: 'getUnclaimedRewards', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'addedValue', - type: 'uint256', - }, - ], - name: 'increaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'contract ILendingPool', - name: 'pool', - type: 'address', - }, - { - internalType: 'address', - name: 'aToken', - type: 'address', - }, - { - internalType: 'string', - name: 'staticATokenName', - type: 'string', - }, - { - internalType: 'string', - name: 'staticATokenSymbol', - type: 'string', - }, - ], - name: 'initialize', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'isImplementation', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'depositor', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - internalType: 'uint16', - name: 'referralCode', - type: 'uint16', - }, - { - internalType: 'bool', - name: 'fromUnderlying', - type: 'bool', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - { - components: [ - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - ], - internalType: 'struct IStaticATokenLM.SignatureParams', - name: 'sigParams', - type: 'tuple', - }, - ], - name: 'metaDeposit', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'staticAmount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'dynamicAmount', - type: 'uint256', - }, - { - internalType: 'bool', - name: 'toUnderlying', - type: 'bool', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - { - components: [ - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - ], - internalType: 'struct IStaticATokenLM.SignatureParams', - name: 'sigParams', - type: 'tuple', - }, - ], - name: 'metaWithdraw', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - ], - name: 'permit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'rate', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'staticToDynamicAmount', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'bool', - name: 'toUnderlying', - type: 'bool', - }, - ], - name: 'withdraw', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'bool', - name: 'toUnderlying', - type: 'bool', - }, - ], - name: 'withdrawDynamicAmount', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type BalancerWrappedAaveToken = typeof balancerWrappedAaveTokenAbi; -export type BalancerWrappedAaveTokenContract = GetContractReturnType; - -export class BalancerWrappedAaveToken__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: balancerWrappedAaveTokenAbi, publicClient: client }); - } -} diff --git a/src/apps/balancer-v2/contracts/viem/index.ts b/src/apps/balancer-v2/contracts/viem/index.ts index c9d01e568..06beb6f88 100644 --- a/src/apps/balancer-v2/contracts/viem/index.ts +++ b/src/apps/balancer-v2/contracts/viem/index.ts @@ -12,10 +12,8 @@ export type { BalancerMerkleOrchard } from './BalancerMerkleOrchard'; export type { BalancerMerkleRedeem } from './BalancerMerkleRedeem'; export type { BalancerPool } from './BalancerPool'; export type { BalancerStablePhantomPool } from './BalancerStablePhantomPool'; -export type { BalancerStaticAToken } from './BalancerStaticAToken'; export type { BalancerVault } from './BalancerVault'; export type { BalancerVeBal } from './BalancerVeBal'; -export type { BalancerWrappedAaveToken } from './BalancerWrappedAaveToken'; export { BalancerBoostedPool__factory } from './BalancerBoostedPool'; export { BalancerChildChainGaugeFactory__factory } from './BalancerChildChainGaugeFactory'; @@ -27,7 +25,5 @@ export { BalancerMerkleOrchard__factory } from './BalancerMerkleOrchard'; export { BalancerMerkleRedeem__factory } from './BalancerMerkleRedeem'; export { BalancerPool__factory } from './BalancerPool'; export { BalancerStablePhantomPool__factory } from './BalancerStablePhantomPool'; -export { BalancerStaticAToken__factory } from './BalancerStaticAToken'; export { BalancerVault__factory } from './BalancerVault'; export { BalancerVeBal__factory } from './BalancerVeBal'; -export { BalancerWrappedAaveToken__factory } from './BalancerWrappedAaveToken'; diff --git a/src/apps/balancer-v2/ethereum/balancer-v2.wrapped-aave.token-fetcher.ts b/src/apps/balancer-v2/ethereum/balancer-v2.wrapped-aave.token-fetcher.ts deleted file mode 100644 index dcbabf34c..000000000 --- a/src/apps/balancer-v2/ethereum/balancer-v2.wrapped-aave.token-fetcher.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetUnderlyingTokensParams } from '~position/template/app-token.template.types'; - -import { BalancerV2ViemContractFactory } from '../contracts'; -import { BalancerWrappedAaveToken } from '../contracts/viem'; - -@PositionTemplate() -export class EthereumBalancerV2WrappedAaveTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Wrapped Aave'; - - isExcludedFromExplore = true; - isExcludedFromTvl = true; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(BalancerV2ViemContractFactory) protected readonly contractFactory: BalancerV2ViemContractFactory, - ) { - super(appToolkit); - } - - async getAddresses() { - return [ - '0x02d60b84491589974263d922d9cc7a3152618ef6', // Wrapped aDAI - '0xd093fa4fb80d09bb30817fdcd442d4d02ed3e5de', // Wrapped aUSDC - '0xf8fd466f12e236f4c96f7cce6c79eadb819abf58', // Wrapped aUSDT - ]; - } - - getContract(address: string) { - return this.contractFactory.balancerWrappedAaveToken({ address, network: this.network }); - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.ATOKEN(), network: this.network }]; - } - - async getPricePerShare() { - return [1]; - } -} diff --git a/src/apps/balancer-v2/polygon/balancer-v2.static-yield.token-fetcher.ts b/src/apps/balancer-v2/polygon/balancer-v2.static-yield.token-fetcher.ts deleted file mode 100644 index 7fd8f51a4..000000000 --- a/src/apps/balancer-v2/polygon/balancer-v2.static-yield.token-fetcher.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { BalancerV2StaticYieldTokenFetcher } from '../common/balancer-v2.static-yield.token-fetcher'; - -@PositionTemplate() -export class PolygonBalancerV2StaticYieldTokenFetcher extends BalancerV2StaticYieldTokenFetcher { - groupLabel = 'Static Yield'; - - staticYieldTokenAddresses = [ - '0xee029120c72b0607344f35b17cdd90025e647b00', // amDAI - '0x221836a597948dce8f3568e044ff123108acc42a', // amUSDC - '0x19c60a251e525fa88cd6f3768416a8024e98fc19', // amUSDT - ]; -} diff --git a/src/apps/bancor-v3/bancor-v3.module.ts b/src/apps/bancor-v3/bancor-v3.module.ts index e9dccbbfb..364d5675e 100644 --- a/src/apps/bancor-v3/bancor-v3.module.ts +++ b/src/apps/bancor-v3/bancor-v3.module.ts @@ -3,7 +3,6 @@ import { Module } from '@nestjs/common'; import { AbstractApp } from '~app/app.dynamic-module'; import { BancorV3ViemContractFactory } from './contracts'; -import { EthereumBancorV3BntPoolTokenFetcher } from './ethereum/bancor-v3.bnt-pool.token-fetcher'; import { EthereumBancorV3FarmContractPositionFetcher } from './ethereum/bancor-v3.farm.contract-position-fetcher'; import { EthereumBancorV3PoolTokenFetcher } from './ethereum/bancor-v3.pool.token-fetcher'; @@ -12,7 +11,6 @@ import { EthereumBancorV3PoolTokenFetcher } from './ethereum/bancor-v3.pool.toke BancorV3ViemContractFactory, EthereumBancorV3FarmContractPositionFetcher, EthereumBancorV3PoolTokenFetcher, - EthereumBancorV3BntPoolTokenFetcher, ], }) export class BancorV3AppModule extends AbstractApp() {} diff --git a/src/apps/bancor-v3/ethereum/bancor-v3.bnt-pool.token-fetcher.ts b/src/apps/bancor-v3/ethereum/bancor-v3.bnt-pool.token-fetcher.ts deleted file mode 100644 index 9051f8985..000000000 --- a/src/apps/bancor-v3/ethereum/bancor-v3.bnt-pool.token-fetcher.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { ETH_ADDR_ALIAS, ZERO_ADDRESS } from '~app-toolkit/constants/address'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - DefaultAppTokenDefinition, - DefaultAppTokenDataProps, - GetUnderlyingTokensParams, - GetPricePerShareParams, -} from '~position/template/app-token.template.types'; - -import { BancorV3ViemContractFactory } from '../contracts'; -import { PoolToken } from '../contracts/viem'; - -@PositionTemplate() -export class EthereumBancorV3BntPoolTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Pools'; - - bntPoolAddress = '0x02651e355d26f3506c1e644ba393fdd9ac95eaca'; - bntPoolTokenAddress = '0xab05cf7c6c3a288cd36326e4f7b8600e7268e344'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(BancorV3ViemContractFactory) protected readonly contractFactory: BancorV3ViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.poolToken({ address, network: this.network }); - } - - async getAddresses() { - return [this.bntPoolTokenAddress]; - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - const underlyingTokenAddressRaw = await contract.read.reserveToken(); - const underlyingTokenAddress = underlyingTokenAddressRaw.toLowerCase().replace(ETH_ADDR_ALIAS, ZERO_ADDRESS); - return [{ address: underlyingTokenAddress, network: this.network }]; - } - - async getPricePerShare({ - multicall, - appToken, - }: GetPricePerShareParams) { - const bntPoolContract = this.contractFactory.bntPool({ - address: this.bntPoolAddress, - network: this.network, - }); - - const ratioRaw = await multicall - .wrap(bntPoolContract) - .read.poolTokenToUnderlying([BigInt(10 ** appToken.tokens[0].decimals)]); - const ratio = Number(ratioRaw) / 10 ** appToken.tokens[0].decimals; - - return [ratio]; - } -} diff --git a/src/apps/concentrator/concentrator.module.ts b/src/apps/concentrator/concentrator.module.ts index 96a4b1fcf..87304eb81 100644 --- a/src/apps/concentrator/concentrator.module.ts +++ b/src/apps/concentrator/concentrator.module.ts @@ -3,11 +3,9 @@ import { Module } from '@nestjs/common'; import { AbstractApp } from '~app/app.dynamic-module'; import { ConcentratorViemContractFactory } from './contracts'; -import { EthereumConcentratorAbcCvxTokenFetcher } from './ethereum/concentrator.abc.token-fetcher'; import { EthereumConcentratorAcrvVaultContractPositionFetcher } from './ethereum/concentrator.acrv-vault.contract-position-fetcher'; import { EthereumConcentratorAfrxethVaultContractPositionFetcher } from './ethereum/concentrator.afrxeth-vault.contract-position-fetcher'; import { EthereumConcentratorAfxsVaultContractPositionFetcher } from './ethereum/concentrator.afxs-vault.contract-position-fetcher'; -import { EthereumConcentratorCompounderTokenFetcher } from './ethereum/concentrator.compounder.token-fetcher'; import { EthereumConcentratorLegacyVaultContractPositionFetcher } from './ethereum/concentrator.legacy-vault.contract-position-fetcher'; import { EthereumConcentratorVestingContractPositionFetcher } from './ethereum/concentrator.vesting.contract-position-fetcher'; import { EthereumConcentratorVotingEscrowContractPositionFetcher } from './ethereum/concentrator.voting-escrow.contract-position-fetcher'; @@ -15,10 +13,8 @@ import { EthereumConcentratorVotingEscrowContractPositionFetcher } from './ether @Module({ providers: [ ConcentratorViemContractFactory, - EthereumConcentratorAbcCvxTokenFetcher, EthereumConcentratorAcrvVaultContractPositionFetcher, EthereumConcentratorAfxsVaultContractPositionFetcher, - EthereumConcentratorCompounderTokenFetcher, EthereumConcentratorLegacyVaultContractPositionFetcher, EthereumConcentratorAfrxethVaultContractPositionFetcher, EthereumConcentratorVotingEscrowContractPositionFetcher, diff --git a/src/apps/concentrator/ethereum/concentrator.abc.token-fetcher.ts b/src/apps/concentrator/ethereum/concentrator.abc.token-fetcher.ts deleted file mode 100644 index e501e71a8..000000000 --- a/src/apps/concentrator/ethereum/concentrator.abc.token-fetcher.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetPricePerShareParams, GetUnderlyingTokensParams } from '~position/template/app-token.template.types'; - -import { ConcentratorViemContractFactory } from '../contracts'; -import { AbcCvx } from '../contracts/viem'; - -@PositionTemplate() -export class EthereumConcentratorAbcCvxTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'abcCVX'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(ConcentratorViemContractFactory) protected readonly contractFactory: ConcentratorViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.abcCvx({ address, network: this.network }); - } - - getAddresses() { - return ['0xdec800c2b17c9673570fdf54450dc1bd79c8e359']; - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [ - { address: await contract.read.curveLpToken(), network: this.network }, - { address: await contract.read.debtToken(), network: this.network }, - ]; - } - - async getPricePerShare({ contract }: GetPricePerShareParams) { - const supply = await contract.read.totalSupply(); - const reserves = await Promise.all([contract.read.totalCurveLpToken(), contract.read.totalDebtToken()]); - return reserves.map(r => Number(r) / Number(supply)); - } -} diff --git a/src/apps/concentrator/ethereum/concentrator.compounder.token-fetcher.ts b/src/apps/concentrator/ethereum/concentrator.compounder.token-fetcher.ts deleted file mode 100644 index 95dc24eee..000000000 --- a/src/apps/concentrator/ethereum/concentrator.compounder.token-fetcher.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetPricePerShareParams, GetUnderlyingTokensParams } from '~position/template/app-token.template.types'; - -import { ConcentratorViemContractFactory } from '../contracts'; -import { AladdinConcentratorCompounder } from '../contracts/viem'; - -@PositionTemplate() -export class EthereumConcentratorCompounderTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Compounder'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(ConcentratorViemContractFactory) protected readonly contractFactory: ConcentratorViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.aladdinConcentratorCompounder({ address, network: this.network }); - } - - getAddresses() { - return [ - '0x2b95a1dcc3d405535f9ed33c219ab38e8d7e0884', // aCRV - '0xb15ad6113264094fd9bf2238729410a07ebe5aba', // afrxETH - '0xdaf03d70fe637b91ba6e521a32e1fb39256d3ec9', // aFXS - '0x43e54c2e7b3e294de3a155785f52ab49d87b9922', // asdCRV - ]; - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.asset(), network: this.network }]; - } - - async getPricePerShare({ appToken, contract }: GetPricePerShareParams) { - const reserveRaw = await contract.read.totalAssets(); - const reserve = Number(reserveRaw) / 10 ** appToken.tokens[0].decimals; - const pricePerShare = appToken.supply > 0 ? reserve / appToken.supply : 0; - return [pricePerShare]; - } -} diff --git a/src/apps/dfx/common/dfx.curve.token-fetcher.ts b/src/apps/dfx/common/dfx.curve.token-fetcher.ts deleted file mode 100644 index ecde40e47..000000000 --- a/src/apps/dfx/common/dfx.curve.token-fetcher.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { getLabelFromToken } from '~app-toolkit/helpers/presentation/image.present'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetDisplayPropsParams, - GetPricePerShareParams, - GetUnderlyingTokensParams, -} from '~position/template/app-token.template.types'; - -import { DfxViemContractFactory } from '../contracts'; -import { DfxCurve } from '../contracts/viem'; - -export abstract class DfxCurveTokenFetcher extends AppTokenTemplatePositionFetcher { - abstract poolAddresses: string[]; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(DfxViemContractFactory) protected readonly contractFactory: DfxViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.dfxCurve({ network: this.network, address }); - } - - async getAddresses() { - return this.poolAddresses; - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [ - { address: await contract.read.numeraires([BigInt(0)]), network: this.network }, - { address: await contract.read.numeraires([BigInt(1)]), network: this.network }, - ]; - } - - async getPricePerShare({ contract, appToken }: GetPricePerShareParams) { - const liquidity = await contract.read.liquidity(); - const reserves = liquidity[1].map(reserveRaw => Number(reserveRaw) / 10 ** 18); // DFX report all token liquidity in 10**18 - - return reserves.map(r => r / appToken.supply); - } - - async getLabel({ appToken }: GetDisplayPropsParams) { - return appToken.tokens.map(v => getLabelFromToken(v)).join(' / '); - } -} diff --git a/src/apps/dfx/dfx.module.ts b/src/apps/dfx/dfx.module.ts index 13ca0658f..49d4dc5f3 100644 --- a/src/apps/dfx/dfx.module.ts +++ b/src/apps/dfx/dfx.module.ts @@ -3,19 +3,15 @@ import { Module } from '@nestjs/common'; import { AbstractApp } from '~app/app.dynamic-module'; import { DfxViemContractFactory } from './contracts'; -import { EthereumDfxCurveTokenFetcher } from './ethereum/dfx.curve.token-fetcher'; import { EthereumDfxStakingContractPositionFetcher } from './ethereum/dfx.staking.contract-position-fetcher'; -import { PolygonDfxCurveTokenFetcher } from './polygon/dfx.curve.token-fetcher'; import { PolygonDfxStakingContractPositionFetcher } from './polygon/dfx.staking.contract-position-fetcher'; @Module({ providers: [ DfxViemContractFactory, // Ethereum - EthereumDfxCurveTokenFetcher, EthereumDfxStakingContractPositionFetcher, // Polygon - PolygonDfxCurveTokenFetcher, PolygonDfxStakingContractPositionFetcher, ], }) diff --git a/src/apps/dfx/ethereum/dfx.curve.token-fetcher.ts b/src/apps/dfx/ethereum/dfx.curve.token-fetcher.ts deleted file mode 100644 index 240d2291e..000000000 --- a/src/apps/dfx/ethereum/dfx.curve.token-fetcher.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { DfxCurveTokenFetcher } from '../common/dfx.curve.token-fetcher'; - -@PositionTemplate() -export class EthereumDfxCurveTokenFetcher extends DfxCurveTokenFetcher { - groupLabel = 'DFX Curves'; - poolAddresses = [ - '0xa6c0cbcaebd93ad3c6c94412ec06aaa37870216d', // cadc-Usdc - '0x1a4ffe0dcbdb4d551cfca61a5626afd190731347', // eurs-Usdc - '0x2bab29a12a9527a179da88f422cdaaa223a90bd5', // xsgd-Usdc - '0xe9669516e09f5710023566458f329cce6437aaac', // nzds-Usdc - '0xc574a613a3900e4314da13eb2287f13689a5b64d', // tryb-Usdc - '0xdd39379ab7c93b9baae29e6ec03795d0bc99a889', // xidr-Usdc - ]; -} diff --git a/src/apps/dfx/polygon/dfx.curve.token-fetcher.ts b/src/apps/dfx/polygon/dfx.curve.token-fetcher.ts deleted file mode 100644 index 3a66f8a97..000000000 --- a/src/apps/dfx/polygon/dfx.curve.token-fetcher.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { DfxCurveTokenFetcher } from '../common/dfx.curve.token-fetcher'; - -@PositionTemplate() -export class PolygonDfxCurveTokenFetcher extends DfxCurveTokenFetcher { - groupLabel = 'DFX Curves'; - poolAddresses = [ - '0x288ab1b113c666abb097bb2ba51b8f3759d7729e', // cadc-Usdc - '0xb72d390e07f40d37d42dfcc43e954ae7c738ad44', // eurs-Usdc - '0x8e3e9cb46e593ec0caf4a1dcd6df3a79a87b1fd7', // xsgd-Usdc - '0x931d6a6cc3f992beee80a1a14a6530d34104b000', // nzds-Usdc - '0xea75cd0b12a8b48f5bddad37ceb15f8cb3d2cc75', // tryb-Usdc - ]; -} diff --git a/src/apps/dinero/assets/0x04c154b66cb340f3ae24111cc767e0184ed00cc6.png b/src/apps/dinero/assets/0x04c154b66cb340f3ae24111cc767e0184ed00cc6.png deleted file mode 100644 index f2008b44e4cd3705192d4435a14dd2ab23b76e31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28098 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 diff --git a/src/apps/dinero/contracts/abis/dinero-apxeth.json b/src/apps/dinero/contracts/abis/dinero-apxeth.json deleted file mode 100644 index 38bad4e9b..000000000 --- a/src/apps/dinero/contracts/abis/dinero-apxeth.json +++ /dev/null @@ -1,1161 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "_asset", - "type": "address" - }, - { - "internalType": "address", - "name": "_platform", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "ExceedsMax", - "type": "error" - }, - { - "inputs": [], - "name": "NoRewards", - "type": "error" - }, - { - "inputs": [], - "name": "NotPirexEth", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAddress", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "caller", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "Deposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "caller", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Harvest", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferStarted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "fee", - "type": "uint256" - } - ], - "name": "PlatformFeeUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "_platform", - "type": "address" - } - ], - "name": "PlatformUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "reward", - "type": "uint256" - } - ], - "name": "RewardAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "_pirexEth", - "type": "address" - } - ], - "name": "SetPirexEth", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "caller", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "Withdraw", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "penalty", - "type": "uint256" - } - ], - "name": "WithdrawalPenaltyUpdated", - "type": "event" - }, - { - "inputs": [], - "name": "DOMAIN_SEPARATOR", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "acceptOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "asset", - "outputs": [ - { - "internalType": "contract ERC20", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "assetsPerShare", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "convertToAssets", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "name": "convertToShares", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "deposit", - "outputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "earned", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "harvest", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "lastTimeRewardApplicable", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lastUpdateTime", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "maxDeposit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "maxMint", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "maxRedeem", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "maxWithdraw", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "mint", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "nonces", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "notifyRewardAmount", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pendingOwner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "periodFinish", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "pirexEth", - "outputs": [ - { - "internalType": "contract IPirexEth", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "platform", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "platformFee", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "name": "previewDeposit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "previewMint", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "previewRedeem", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "name": "previewWithdraw", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "redeem", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerToken", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerTokenPaid", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerTokenStored", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardRate", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewards", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_pirexEth", - "type": "address" - } - ], - "name": "setPirexEth", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_platform", - "type": "address" - } - ], - "name": "setPlatform", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "fee", - "type": "uint256" - } - ], - "name": "setPlatformFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "penalty", - "type": "uint256" - } - ], - "name": "setWithdrawalPenalty", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalAssets", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalStaked", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "withdraw", - "outputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "withdrawalPenalty", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - } -] diff --git a/src/apps/dinero/contracts/abis/dinero-pxeth.json b/src/apps/dinero/contracts/abis/dinero-pxeth.json deleted file mode 100644 index 3b44b3ad1..000000000 --- a/src/apps/dinero/contracts/abis/dinero-pxeth.json +++ /dev/null @@ -1,778 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "_admin", - "type": "address" - }, - { - "internalType": "uint48", - "name": "_initialDelay", - "type": "uint48" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "EmptyString", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAmount", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "DefaultAdminDelayChangeCanceled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint48", - "name": "newDelay", - "type": "uint48" - }, - { - "indexed": false, - "internalType": "uint48", - "name": "effectSchedule", - "type": "uint48" - } - ], - "name": "DefaultAdminDelayChangeScheduled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "DefaultAdminTransferCanceled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAdmin", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint48", - "name": "acceptSchedule", - "type": "uint48" - } - ], - "name": "DefaultAdminTransferScheduled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DOMAIN_SEPARATOR", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "acceptDefaultAdminTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "beginDefaultAdminTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "cancelDefaultAdminTransfer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint48", - "name": "newDelay", - "type": "uint48" - } - ], - "name": "changeDefaultAdminDelay", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "defaultAdmin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "defaultAdminDelay", - "outputs": [ - { - "internalType": "uint48", - "name": "", - "type": "uint48" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "defaultAdminDelayIncreaseWait", - "outputs": [ - { - "internalType": "uint48", - "name": "", - "type": "uint48" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "nonces", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "operatorApprove", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pendingDefaultAdmin", - "outputs": [ - { - "internalType": "address", - "name": "newAdmin", - "type": "address" - }, - { - "internalType": "uint48", - "name": "schedule", - "type": "uint48" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pendingDefaultAdminDelay", - "outputs": [ - { - "internalType": "uint48", - "name": "newDelay", - "type": "uint48" - }, - { - "internalType": "uint48", - "name": "schedule", - "type": "uint48" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rollbackDefaultAdminDelay", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/dinero/contracts/index.ts b/src/apps/dinero/contracts/index.ts deleted file mode 100644 index 5dcfebdf6..000000000 --- a/src/apps/dinero/contracts/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -export * from './viem.contract-factory'; diff --git a/src/apps/dinero/contracts/viem.contract-factory.ts b/src/apps/dinero/contracts/viem.contract-factory.ts deleted file mode 100644 index 952ab1356..000000000 --- a/src/apps/dinero/contracts/viem.contract-factory.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Injectable, Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { Network } from '~types/network.interface'; - -import { DineroApxeth__factory, DineroPxeth__factory } from './viem'; - -type ContractOpts = { address: string; network: Network }; - -@Injectable() -export class DineroViemContractFactory { - constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) {} - - dineroApxeth({ address, network }: ContractOpts) { - return DineroApxeth__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - dineroPxeth({ address, network }: ContractOpts) { - return DineroPxeth__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } -} diff --git a/src/apps/dinero/contracts/viem/DineroApxeth.ts b/src/apps/dinero/contracts/viem/DineroApxeth.ts deleted file mode 100644 index 8760eeed4..000000000 --- a/src/apps/dinero/contracts/viem/DineroApxeth.ts +++ /dev/null @@ -1,1175 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const dineroApxethAbi = [ - { - inputs: [ - { - internalType: 'address', - name: '_asset', - type: 'address', - }, - { - internalType: 'address', - name: '_platform', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - inputs: [], - name: 'ExceedsMax', - type: 'error', - }, - { - inputs: [], - name: 'NoRewards', - type: 'error', - }, - { - inputs: [], - name: 'NotPirexEth', - type: 'error', - }, - { - inputs: [], - name: 'ZeroAddress', - type: 'error', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'Deposit', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Harvest', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'previousOwner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnershipTransferStarted', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'previousOwner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnershipTransferred', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'fee', - type: 'uint256', - }, - ], - name: 'PlatformFeeUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: '_platform', - type: 'address', - }, - ], - name: 'PlatformUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'reward', - type: 'uint256', - }, - ], - name: 'RewardAdded', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: '_pirexEth', - type: 'address', - }, - ], - name: 'SetPirexEth', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'Withdraw', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'penalty', - type: 'uint256', - }, - ], - name: 'WithdrawalPenaltyUpdated', - type: 'event', - }, - { - inputs: [], - name: 'DOMAIN_SEPARATOR', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'acceptOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'asset', - outputs: [ - { - internalType: 'contract ERC20', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'assetsPerShare', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'convertToAssets', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - ], - name: 'convertToShares', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - ], - name: 'deposit', - outputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'earned', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'harvest', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'lastTimeRewardApplicable', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'lastUpdateTime', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'maxDeposit', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'maxMint', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'maxRedeem', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'maxWithdraw', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - ], - name: 'mint', - outputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'nonces', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'notifyRewardAmount', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'owner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'pendingOwner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'periodFinish', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - ], - name: 'permit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'pirexEth', - outputs: [ - { - internalType: 'contract IPirexEth', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'platform', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'platformFee', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - ], - name: 'previewDeposit', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'previewMint', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'previewRedeem', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - ], - name: 'previewWithdraw', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'redeem', - outputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'renounceOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'rewardPerToken', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'rewardPerTokenPaid', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'rewardPerTokenStored', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'rewardRate', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'rewards', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_pirexEth', - type: 'address', - }, - ], - name: 'setPirexEth', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_platform', - type: 'address', - }, - ], - name: 'setPlatform', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'fee', - type: 'uint256', - }, - ], - name: 'setPlatformFee', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'penalty', - type: 'uint256', - }, - ], - name: 'setWithdrawalPenalty', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalAssets', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalStaked', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'transferOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'withdraw', - outputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'withdrawalPenalty', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, -] as const; - -export type DineroApxeth = typeof dineroApxethAbi; -export type DineroApxethContract = GetContractReturnType; - -export class DineroApxeth__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: dineroApxethAbi, publicClient: client }); - } -} diff --git a/src/apps/dinero/contracts/viem/DineroPxeth.ts b/src/apps/dinero/contracts/viem/DineroPxeth.ts deleted file mode 100644 index 8c4f6e83a..000000000 --- a/src/apps/dinero/contracts/viem/DineroPxeth.ts +++ /dev/null @@ -1,792 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const dineroPxethAbi = [ - { - inputs: [ - { - internalType: 'address', - name: '_admin', - type: 'address', - }, - { - internalType: 'uint48', - name: '_initialDelay', - type: 'uint48', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - inputs: [], - name: 'EmptyString', - type: 'error', - }, - { - inputs: [], - name: 'ZeroAddress', - type: 'error', - }, - { - inputs: [], - name: 'ZeroAmount', - type: 'error', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [], - name: 'DefaultAdminDelayChangeCanceled', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint48', - name: 'newDelay', - type: 'uint48', - }, - { - indexed: false, - internalType: 'uint48', - name: 'effectSchedule', - type: 'uint48', - }, - ], - name: 'DefaultAdminDelayChangeScheduled', - type: 'event', - }, - { - anonymous: false, - inputs: [], - name: 'DefaultAdminTransferCanceled', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAdmin', - type: 'address', - }, - { - indexed: false, - internalType: 'uint48', - name: 'acceptSchedule', - type: 'uint48', - }, - ], - name: 'DefaultAdminTransferScheduled', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'role', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'bytes32', - name: 'previousAdminRole', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'bytes32', - name: 'newAdminRole', - type: 'bytes32', - }, - ], - name: 'RoleAdminChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'role', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'address', - name: 'account', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'sender', - type: 'address', - }, - ], - name: 'RoleGranted', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'role', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'address', - name: 'account', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'sender', - type: 'address', - }, - ], - name: 'RoleRevoked', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - inputs: [], - name: 'DEFAULT_ADMIN_ROLE', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'DOMAIN_SEPARATOR', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'acceptDefaultAdminTransfer', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newAdmin', - type: 'address', - }, - ], - name: 'beginDefaultAdminTransfer', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_from', - type: 'address', - }, - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'burn', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'cancelDefaultAdminTransfer', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint48', - name: 'newDelay', - type: 'uint48', - }, - ], - name: 'changeDefaultAdminDelay', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'defaultAdmin', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'defaultAdminDelay', - outputs: [ - { - internalType: 'uint48', - name: '', - type: 'uint48', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'defaultAdminDelayIncreaseWait', - outputs: [ - { - internalType: 'uint48', - name: '', - type: 'uint48', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'role', - type: 'bytes32', - }, - ], - name: 'getRoleAdmin', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'role', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'grantRole', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'role', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'hasRole', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_to', - type: 'address', - }, - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'mint', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'nonces', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_from', - type: 'address', - }, - { - internalType: 'address', - name: '_to', - type: 'address', - }, - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'operatorApprove', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'owner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'pendingDefaultAdmin', - outputs: [ - { - internalType: 'address', - name: 'newAdmin', - type: 'address', - }, - { - internalType: 'uint48', - name: 'schedule', - type: 'uint48', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'pendingDefaultAdminDelay', - outputs: [ - { - internalType: 'uint48', - name: 'newDelay', - type: 'uint48', - }, - { - internalType: 'uint48', - name: 'schedule', - type: 'uint48', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - ], - name: 'permit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'role', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'renounceRole', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'role', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'revokeRole', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'rollbackDefaultAdminDelay', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes4', - name: 'interfaceId', - type: 'bytes4', - }, - ], - name: 'supportsInterface', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type DineroPxeth = typeof dineroPxethAbi; -export type DineroPxethContract = GetContractReturnType; - -export class DineroPxeth__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: dineroPxethAbi, publicClient: client }); - } -} diff --git a/src/apps/dinero/contracts/viem/index.ts b/src/apps/dinero/contracts/viem/index.ts deleted file mode 100644 index bd051a32d..000000000 --- a/src/apps/dinero/contracts/viem/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ - -export type { DineroApxeth } from './DineroApxeth'; -export type { DineroPxeth } from './DineroPxeth'; - -export { DineroApxeth__factory } from './DineroApxeth'; -export { DineroPxeth__factory } from './DineroPxeth'; diff --git a/src/apps/dinero/dinero.module.ts b/src/apps/dinero/dinero.module.ts deleted file mode 100644 index 73a4a0ac2..000000000 --- a/src/apps/dinero/dinero.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { AbstractApp } from '~app/app.dynamic-module'; - -import { DineroViemContractFactory } from './contracts'; -import { EthereumDineroApxethTokenFetcher } from './ethereum/dinero.apxeth.token-fetcher'; -import { EthereumDineroPirexEthTokenFetcher } from './ethereum/dinero.pxeth.token-fetcher'; - -@Module({ - providers: [DineroViemContractFactory, EthereumDineroPirexEthTokenFetcher, EthereumDineroApxethTokenFetcher], -}) -export class DineroAppModule extends AbstractApp() { } diff --git a/src/apps/dinero/ethereum/dinero.apxeth.token-fetcher.ts b/src/apps/dinero/ethereum/dinero.apxeth.token-fetcher.ts deleted file mode 100644 index 398387247..000000000 --- a/src/apps/dinero/ethereum/dinero.apxeth.token-fetcher.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { getTokenImg } from '~app-toolkit/helpers/presentation/image.present'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetUnderlyingTokensParams, GetPricePerShareParams } from '~position/template/app-token.template.types'; - -import { DineroViemContractFactory } from '../contracts'; -import { DineroApxeth } from '../contracts/viem/DineroApxeth'; - -@PositionTemplate() -export class EthereumDineroApxethTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'apxETH'; - - isExcludedFromTvl = true; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(DineroViemContractFactory) protected readonly dineroContractFactory: DineroViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.dineroContractFactory.dineroApxeth({ address, network: this.network }); - } - - async getAddresses(): Promise { - return ['0x9ba021b0a9b958b5e75ce9f6dff97c7ee52cb3e6']; - } - - async getImages({ appToken }) { - return [getTokenImg(appToken.address, this.network)]; - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.asset(), network: this.network }]; - } - - async getPricePerShare({ contract }: GetPricePerShareParams) { - const totalSupply = await contract.read.totalSupply(); - const totalAssets = await contract.read.totalAssets(); - return Number(totalSupply) == 0 ? [1] : [Number(totalAssets) / Number(totalSupply)]; - } -} diff --git a/src/apps/dinero/ethereum/dinero.pxeth.token-fetcher.ts b/src/apps/dinero/ethereum/dinero.pxeth.token-fetcher.ts deleted file mode 100644 index 40c9b40dd..000000000 --- a/src/apps/dinero/ethereum/dinero.pxeth.token-fetcher.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { getTokenImg } from '~app-toolkit/helpers/presentation/image.present'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; - -import { DineroViemContractFactory } from '../contracts'; -import { DineroPxeth } from '../contracts/viem/DineroPxeth'; - -@PositionTemplate() -export class EthereumDineroPirexEthTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'pxETH'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(DineroViemContractFactory) protected readonly dineroContractFactory: DineroViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.dineroContractFactory.dineroPxeth({ address, network: this.network }); - } - - async getAddresses() { - return ['0x04c154b66cb340f3ae24111cc767e0184ed00cc6']; - } - - async getImages({ appToken }) { - return [getTokenImg(appToken.address, this.network)]; - } - - async getUnderlyingTokenDefinitions() { - return [{ address: '0x0000000000000000000000000000000000000000', network: this.network }]; - } - - async getPricePerShare() { - return [1]; - } -} diff --git a/src/apps/euler/assets/logo.png b/src/apps/euler/assets/logo.png deleted file mode 100644 index d124e8878574d19b401ebad98535703df210e248..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11483 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

B$)(;iZs7VbM_kA=~fCT0VsH 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 jarXbh>z&V+(`https://name.web3.storage/name/${ipfsHash}`) - .then(ipfs => - axios - .get( - `https://${ipfs.data.value.replace('/ipfs/', '')}.ipfs.w3s.link/EulerActivatedMarkets.json`, - ) - .then(v => v.data.markets), - ); - } - - async getStakingDefinitions(opts?: GetFarmDefinitionsProps) { - const stakingDefinitions = await this.getStakingDefinitionsData(opts); - - return Promise.all( - stakingDefinitions - .filter(market => market.eulDistribution?.staking) - .map(async ({ underlying, eulDistribution }) => { - const market = await this.tokenCacheManager.getMarketByUnderlying(underlying); - - return { - tokenAddress: underlying, - eTokenAddress: market?.eTokenAddress ?? null, - vaultAddress: eulDistribution?.staking?.contractAddress ?? '', - apr: eulDistribution?.staking?.APR ?? null, - }; - }), - ); - } -} diff --git a/src/apps/euler/common/euler.d-token.token-fetcher.ts b/src/apps/euler/common/euler.d-token.token-fetcher.ts deleted file mode 100644 index 3123a73cc..000000000 --- a/src/apps/euler/common/euler.d-token.token-fetcher.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetUnderlyingTokensParams, - GetAddressesParams, - GetDataPropsParams, - DefaultAppTokenDataProps, -} from '~position/template/app-token.template.types'; - -import { EulerViemContractFactory } from '../contracts'; -import { EulerDtokenContract } from '../contracts/viem'; - -import { EulerTokenDefinition, EulerTokenDefinitionsResolver, EulerTokenType } from './euler.token-definition-resolver'; - -export abstract class EulerDTokenTokenFetcher extends AppTokenTemplatePositionFetcher< - EulerDtokenContract, - DefaultAppTokenDataProps, - EulerTokenDefinition -> { - isDebt = true; - abstract tokenType: EulerTokenType; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(EulerTokenDefinitionsResolver) - private readonly tokenDefinitionsResolver: EulerTokenDefinitionsResolver, - @Inject(EulerViemContractFactory) protected readonly contractFactory: EulerViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.eulerDtokenContract({ network: this.network, address }); - } - - async getDefinitions(): Promise { - return this.tokenDefinitionsResolver.getTokenDefinitions(this.tokenType); - } - - async getAddresses({ definitions }: GetAddressesParams): Promise { - return definitions.map(v => v.address); - } - - async getSymbol({ address }): Promise { - const market = await this.tokenDefinitionsResolver.getMarket(address, this.tokenType); - return `D${market!.symbol}`; - } - - async getUnderlyingTokenDefinitions({ - definition, - }: GetUnderlyingTokensParams) { - return [{ address: definition.underlyingTokenAddress, network: this.network }]; - } - - async getPricePerShare() { - return [1]; - } - - async getApy({ appToken }: GetDataPropsParams) { - const market = await this.tokenDefinitionsResolver.getMarket(appToken.address, this.tokenType); - return (Number(market!.borrowAPY) * 100) / 1e27; - } -} diff --git a/src/apps/euler/common/euler.e-token.token-fetcher.ts b/src/apps/euler/common/euler.e-token.token-fetcher.ts deleted file mode 100644 index 956aac8bb..000000000 --- a/src/apps/euler/common/euler.e-token.token-fetcher.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { Inject } from '@nestjs/common'; -import { ethers } from 'ethers'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetUnderlyingTokensParams, - GetAddressesParams, - GetDataPropsParams, - DefaultAppTokenDataProps, - GetPricePerShareParams, -} from '~position/template/app-token.template.types'; - -import { EulerViemContractFactory } from '../contracts'; -import { EulerEtokenContract } from '../contracts/viem'; - -import { EulerTokenDefinition, EulerTokenDefinitionsResolver, EulerTokenType } from './euler.token-definition-resolver'; - -export abstract class EulerETokenTokenFetcher extends AppTokenTemplatePositionFetcher< - EulerEtokenContract, - DefaultAppTokenDataProps, - EulerTokenDefinition -> { - abstract tokenType: EulerTokenType; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(EulerTokenDefinitionsResolver) - private readonly tokenDefinitionsResolver: EulerTokenDefinitionsResolver, - @Inject(EulerViemContractFactory) protected readonly contractFactory: EulerViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.eulerEtokenContract({ network: this.network, address }); - } - - async getDefinitions(): Promise { - return this.tokenDefinitionsResolver.getTokenDefinitions(this.tokenType); - } - - async getAddresses({ definitions }: GetAddressesParams): Promise { - return definitions.map(v => v.address); - } - - async getUnderlyingTokenDefinitions({ - definition, - }: GetUnderlyingTokensParams) { - return [{ address: definition.underlyingTokenAddress, network: this.network }]; - } - - async getSymbol({ address }): Promise { - const market = await this.tokenDefinitionsResolver.getMarket(address, this.tokenType); - return `E${market!.symbol}`; - } - - async getPricePerShare({ contract, multicall, appToken }: GetPricePerShareParams) { - const oneUnit = ethers.BigNumber.from(10).pow(18).toString(); - const pricePerShareRaw = await multicall.wrap(contract).read.convertBalanceToUnderlying([BigInt(oneUnit)]); - const pricePerShare = Number(pricePerShareRaw) / 10 ** appToken.tokens[0].decimals; - return [pricePerShare]; - } - - async getLiquidity({ appToken }: GetDataPropsParams) { - return (this.isDebt ? -1 : 1) * appToken.price * appToken.supply; - } - - async getReserves({ appToken }: GetDataPropsParams) { - return [appToken.pricePerShare[0] * appToken.supply]; - } - - async getApy({ appToken }: GetDataPropsParams) { - const market = await this.tokenDefinitionsResolver.getMarket(appToken.address, this.tokenType); - return (Number(market!.supplyAPY) * 100) / 1e27; - } -} diff --git a/src/apps/euler/common/euler.p-token.token-fetcher.ts b/src/apps/euler/common/euler.p-token.token-fetcher.ts deleted file mode 100644 index 98811cbc3..000000000 --- a/src/apps/euler/common/euler.p-token.token-fetcher.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetUnderlyingTokensParams, - GetAddressesParams, - DefaultAppTokenDataProps, -} from '~position/template/app-token.template.types'; - -import { EulerViemContractFactory } from '../contracts'; -import { EulerPtokenContract } from '../contracts/viem'; - -import { EulerTokenDefinition, EulerTokenDefinitionsResolver, EulerTokenType } from './euler.token-definition-resolver'; - -export abstract class EulerPTokenTokenFetcher extends AppTokenTemplatePositionFetcher< - EulerPtokenContract, - DefaultAppTokenDataProps, - EulerTokenDefinition -> { - abstract tokenType: EulerTokenType; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(EulerTokenDefinitionsResolver) - private readonly tokenDefinitionsResolver: EulerTokenDefinitionsResolver, - @Inject(EulerViemContractFactory) protected readonly contractFactory: EulerViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.eulerPtokenContract({ network: this.network, address }); - } - - async getDefinitions(): Promise { - return this.tokenDefinitionsResolver.getTokenDefinitions(this.tokenType); - } - - async getAddresses({ definitions }: GetAddressesParams): Promise { - return definitions.map(v => v.address); - } - - async getUnderlyingTokenDefinitions({ - definition, - }: GetUnderlyingTokensParams) { - return [{ address: definition.underlyingTokenAddress, network: this.network }]; - } - - async getPricePerShare() { - return [1]; - } - - async getSymbol({ address }): Promise { - const market = await this.tokenDefinitionsResolver.getMarket(address, this.tokenType); - return `P${market!.symbol}`; - } -} diff --git a/src/apps/euler/common/euler.token-definition-resolver.ts b/src/apps/euler/common/euler.token-definition-resolver.ts deleted file mode 100644 index 292274f1d..000000000 --- a/src/apps/euler/common/euler.token-definition-resolver.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { Inject, Injectable } from '@nestjs/common'; -import { gql } from 'graphql-request'; -import _ from 'lodash'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { ZERO_ADDRESS } from '~app-toolkit/constants/address'; -import { gqlFetch } from '~app-toolkit/helpers/the-graph.helper'; - -export type EulerTokenDefinition = { - address: string; - underlyingTokenAddress: string; -}; - -interface EulerMarketsResponse { - eulerMarketStore: { - markets: { - id: string; - interestRate: string; - borrowAPY: string; - supplyAPY: string; - totalSupply: string; - twap: string; - name: string; - symbol: string; - decimals: string; - dTokenAddress: string; - eTokenAddress: string; - pTokenAddress: string; - }[]; - }; -} - -export const MARKET_QUERY = gql` - { - eulerMarketStore(id: "euler-market-store") { - markets(first: 1000) { - id - interestRate - borrowAPY - supplyAPY - totalSupply - twap - name - symbol - decimals - dTokenAddress - eTokenAddress - pTokenAddress - } - } - } -`; - -export enum EulerTokenType { - D_TOKEN = 'dTokenAddress', - E_TOKEN = 'eTokenAddress', - P_TOKEN = 'pTokenAddress', -} - -const brokenMarketAddress = ['0x31c8eacbffdd875c74b94b077895bd78cf1e64a3']; // RAD - -@Injectable() -export class EulerTokenDefinitionsResolver { - constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) {} - - private async getTokenDefinitionsData() { - const data = await gqlFetch({ - endpoint: `https://api.thegraph.com/subgraphs/name/euler-xyz/euler-mainnet?source=zapper`, - query: MARKET_QUERY, - }); - - const marketRaw = data.eulerMarketStore.markets; - - return marketRaw.filter(x => !brokenMarketAddress.includes(x.id)); - } - - async getTokenDefinitions(tokenType: EulerTokenType) { - const definitionsData = await this.getTokenDefinitionsData(); - - const tokenDefinitions = definitionsData.map(market => { - if (market[tokenType] === ZERO_ADDRESS) return null; - return { - address: market[tokenType].toLowerCase(), - underlyingTokenAddress: market.id.toLowerCase(), - }; - }); - - return _.compact(tokenDefinitions); - } - - async getMarket(tokenAddress: string, tokenType: EulerTokenType) { - const definitionsData = await this.getTokenDefinitionsData(); - - return definitionsData.find(x => x[tokenType].toLowerCase() === tokenAddress); - } - - async getMarketByUnderlying(tokenAddress: string) { - const definitionsData = await this.getTokenDefinitionsData(); - - return definitionsData.find(x => x.id.toLowerCase() === tokenAddress); - } -} diff --git a/src/apps/euler/contracts/abis/euler-dtoken-contract.json b/src/apps/euler/contracts/abis/euler-dtoken-contract.json deleted file mode 100644 index 3d10ae7aa..000000000 --- a/src/apps/euler/contracts/abis/euler-dtoken-contract.json +++ /dev/null @@ -1,1193 +0,0 @@ -[ - { - "stateMutability": "nonpayable", - "inputs": [ - { - "type": "bytes32", - "internalType": "bytes32", - "name": "moduleGitCommit_" - } - ], - "type": "constructor" - }, - { - "type": "event", - "inputs": [ - { - "name": "owner", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "indexed": true, - "internalType": "address", - "type": "address", - "name": "spender" - }, - { - "name": "value", - "internalType": "uint256", - "indexed": false, - "type": "uint256" - } - ], - "name": "Approval", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "indexed": true, - "type": "address", - "name": "underlying" - }, - { - "type": "uint256", - "internalType": "uint256", - "indexed": false, - "name": "totalBalances" - }, - { - "name": "totalBorrows", - "type": "uint256", - "internalType": "uint256", - "indexed": false - }, - { - "internalType": "uint96", - "indexed": false, - "type": "uint96", - "name": "reserveBalance" - }, - { - "name": "poolSize", - "type": "uint256", - "internalType": "uint256", - "indexed": false - }, - { - "name": "interestAccumulator", - "indexed": false, - "internalType": "uint256", - "type": "uint256" - }, - { - "name": "interestRate", - "type": "int96", - "internalType": "int96", - "indexed": false - }, - { - "name": "timestamp", - "indexed": false, - "internalType": "uint256", - "type": "uint256" - } - ], - "type": "event", - "anonymous": false, - "name": "AssetStatus" - }, - { - "anonymous": false, - "name": "Borrow", - "inputs": [ - { - "name": "underlying", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "account" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256", - "indexed": false - } - ], - "type": "event" - }, - { - "name": "DelegateAverageLiquidity", - "anonymous": false, - "inputs": [ - { - "name": "account", - "indexed": true, - "internalType": "address", - "type": "address" - }, - { - "name": "delegate", - "indexed": true, - "internalType": "address", - "type": "address" - } - ], - "type": "event" - }, - { - "name": "Deposit", - "anonymous": false, - "type": "event", - "inputs": [ - { - "name": "underlying", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "type": "address", - "indexed": true, - "internalType": "address", - "name": "account" - }, - { - "internalType": "uint256", - "indexed": false, - "type": "uint256", - "name": "amount" - } - ] - }, - { - "type": "event", - "inputs": [ - { - "type": "address", - "indexed": true, - "internalType": "address", - "name": "underlying" - }, - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "account" - } - ], - "name": "EnterMarket", - "anonymous": false - }, - { - "anonymous": false, - "name": "ExitMarket", - "inputs": [ - { - "type": "address", - "indexed": true, - "internalType": "address", - "name": "underlying" - }, - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "account" - } - ], - "type": "event" - }, - { - "name": "Genesis", - "anonymous": false, - "type": "event", - "inputs": [] - }, - { - "type": "event", - "inputs": [ - { - "name": "underlying", - "indexed": true, - "internalType": "address", - "type": "address" - }, - { - "name": "recipient", - "internalType": "address", - "indexed": true, - "type": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "name": "GovConvertReserves", - "anonymous": false - }, - { - "type": "event", - "inputs": [ - { - "type": "address", - "indexed": true, - "internalType": "address", - "name": "underlying" - }, - { - "internalType": "struct Storage.AssetConfig", - "indexed": false, - "type": "tuple", - "name": "newConfig", - "components": [ - { - "internalType": "address", - "type": "address", - "name": "eTokenAddress" - }, - { - "type": "bool", - "internalType": "bool", - "name": "borrowIsolated" - }, - { - "internalType": "uint32", - "type": "uint32", - "name": "collateralFactor" - }, - { - "name": "borrowFactor", - "internalType": "uint32", - "type": "uint32" - }, - { - "internalType": "uint24", - "type": "uint24", - "name": "twapWindow" - } - ] - } - ], - "name": "GovSetAssetConfig", - "anonymous": false - }, - { - "name": "GovSetIRM", - "anonymous": false, - "type": "event", - "inputs": [ - { - "name": "underlying", - "indexed": true, - "internalType": "address", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "type": "uint256", - "name": "interestRateModel" - }, - { - "indexed": false, - "internalType": "bytes", - "type": "bytes", - "name": "resetParams" - } - ] - }, - { - "name": "GovSetPricingConfig", - "anonymous": false, - "inputs": [ - { - "name": "underlying", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "type": "uint16", - "indexed": false, - "internalType": "uint16", - "name": "newPricingType" - }, - { - "type": "uint32", - "internalType": "uint32", - "indexed": false, - "name": "newPricingParameter" - } - ], - "type": "event" - }, - { - "type": "event", - "inputs": [ - { - "name": "underlying", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newReserveFee", - "indexed": false, - "internalType": "uint32", - "type": "uint32" - } - ], - "anonymous": false, - "name": "GovSetReserveFee" - }, - { - "anonymous": false, - "name": "InstallerInstallModule", - "inputs": [ - { - "type": "uint256", - "indexed": true, - "internalType": "uint256", - "name": "moduleId" - }, - { - "indexed": true, - "internalType": "address", - "type": "address", - "name": "moduleImpl" - }, - { - "name": "moduleGitCommit", - "internalType": "bytes32", - "indexed": false, - "type": "bytes32" - } - ], - "type": "event" - }, - { - "type": "event", - "inputs": [ - { - "indexed": true, - "internalType": "address", - "type": "address", - "name": "newGovernorAdmin" - } - ], - "anonymous": false, - "name": "InstallerSetGovernorAdmin" - }, - { - "inputs": [ - { - "name": "newUpgradeAdmin", - "type": "address", - "internalType": "address", - "indexed": true - } - ], - "type": "event", - "anonymous": false, - "name": "InstallerSetUpgradeAdmin" - }, - { - "type": "event", - "inputs": [ - { - "internalType": "address", - "indexed": true, - "type": "address", - "name": "liquidator" - }, - { - "name": "violator", - "internalType": "address", - "indexed": true, - "type": "address" - }, - { - "type": "address", - "indexed": true, - "internalType": "address", - "name": "underlying" - }, - { - "type": "address", - "internalType": "address", - "indexed": false, - "name": "collateral" - }, - { - "name": "repay", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "type": "uint256", - "internalType": "uint256", - "indexed": false, - "name": "yield" - }, - { - "name": "healthScore", - "type": "uint256", - "internalType": "uint256", - "indexed": false - }, - { - "name": "baseDiscount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "type": "uint256", - "internalType": "uint256", - "indexed": false, - "name": "discount" - } - ], - "anonymous": false, - "name": "Liquidation" - }, - { - "type": "event", - "inputs": [ - { - "internalType": "address", - "indexed": true, - "type": "address", - "name": "underlying" - }, - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "eToken" - }, - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "dToken" - } - ], - "name": "MarketActivated", - "anonymous": false - }, - { - "name": "PTokenActivated", - "anonymous": false, - "inputs": [ - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "underlying" - }, - { - "name": "pToken", - "type": "address", - "internalType": "address", - "indexed": true - } - ], - "type": "event" - }, - { - "anonymous": false, - "name": "PTokenUnWrap", - "inputs": [ - { - "name": "underlying", - "internalType": "address", - "indexed": true, - "type": "address" - }, - { - "type": "address", - "indexed": true, - "internalType": "address", - "name": "account" - }, - { - "internalType": "uint256", - "indexed": false, - "type": "uint256", - "name": "amount" - } - ], - "type": "event" - }, - { - "name": "PTokenWrap", - "anonymous": false, - "inputs": [ - { - "name": "underlying", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "indexed": true, - "internalType": "address", - "type": "address", - "name": "account" - }, - { - "type": "uint256", - "internalType": "uint256", - "indexed": false, - "name": "amount" - } - ], - "type": "event" - }, - { - "anonymous": false, - "name": "ProxyCreated", - "type": "event", - "inputs": [ - { - "type": "address", - "indexed": true, - "internalType": "address", - "name": "proxy" - }, - { - "indexed": false, - "internalType": "uint256", - "type": "uint256", - "name": "moduleId" - } - ] - }, - { - "name": "Repay", - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "type": "address", - "name": "underlying" - }, - { - "name": "account", - "indexed": true, - "internalType": "address", - "type": "address" - }, - { - "name": "amount", - "internalType": "uint256", - "indexed": false, - "type": "uint256" - } - ], - "type": "event" - }, - { - "name": "RequestBorrow", - "anonymous": false, - "type": "event", - "inputs": [ - { - "name": "account", - "internalType": "address", - "indexed": true, - "type": "address" - }, - { - "name": "amount", - "internalType": "uint256", - "indexed": false, - "type": "uint256" - } - ] - }, - { - "name": "RequestBurn", - "anonymous": false, - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "type": "event" - }, - { - "type": "event", - "inputs": [ - { - "indexed": true, - "internalType": "address", - "type": "address", - "name": "account" - }, - { - "name": "amount", - "indexed": false, - "internalType": "uint256", - "type": "uint256" - } - ], - "name": "RequestDeposit", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "indexed": true, - "type": "address", - "name": "liquidator" - }, - { - "name": "violator", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "name": "underlying", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "name": "collateral", - "indexed": false, - "internalType": "address", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "type": "uint256", - "name": "repay" - }, - { - "type": "uint256", - "internalType": "uint256", - "indexed": false, - "name": "minYield" - } - ], - "type": "event", - "anonymous": false, - "name": "RequestLiquidate" - }, - { - "inputs": [ - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "account" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256", - "indexed": false - } - ], - "type": "event", - "name": "RequestMint", - "anonymous": false - }, - { - "name": "RequestRepay", - "anonymous": false, - "inputs": [ - { - "internalType": "address", - "indexed": true, - "type": "address", - "name": "account" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "type": "event" - }, - { - "anonymous": false, - "name": "RequestSwap", - "inputs": [ - { - "indexed": true, - "internalType": "address", - "type": "address", - "name": "accountIn" - }, - { - "name": "accountOut", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "internalType": "address", - "indexed": true, - "type": "address", - "name": "underlyingIn" - }, - { - "internalType": "address", - "indexed": false, - "type": "address", - "name": "underlyingOut" - }, - { - "type": "uint256", - "indexed": false, - "internalType": "uint256", - "name": "amount" - }, - { - "name": "swapType", - "internalType": "uint256", - "indexed": false, - "type": "uint256" - } - ], - "type": "event" - }, - { - "inputs": [ - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "from" - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "internalType": "uint256", - "indexed": false, - "type": "uint256", - "name": "amount" - } - ], - "type": "event", - "name": "RequestTransferDToken", - "anonymous": false - }, - { - "name": "RequestTransferEToken", - "anonymous": false, - "inputs": [ - { - "name": "from", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "name": "to", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "amount", - "internalType": "uint256", - "indexed": false, - "type": "uint256" - } - ], - "type": "event" - }, - { - "anonymous": false, - "name": "RequestWithdraw", - "type": "event", - "inputs": [ - { - "name": "account", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "type": "uint256", - "indexed": false, - "internalType": "uint256", - "name": "amount" - } - ] - }, - { - "anonymous": false, - "name": "TrackAverageLiquidity", - "inputs": [ - { - "type": "address", - "indexed": true, - "internalType": "address", - "name": "account" - } - ], - "type": "event" - }, - { - "name": "Transfer", - "anonymous": false, - "type": "event", - "inputs": [ - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "to" - }, - { - "type": "uint256", - "indexed": false, - "internalType": "uint256", - "name": "value" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "indexed": true, - "type": "address", - "name": "account" - } - ], - "type": "event", - "anonymous": false, - "name": "UnTrackAverageLiquidity" - }, - { - "inputs": [ - { - "name": "underlying", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "type": "address", - "indexed": true, - "internalType": "address", - "name": "account" - }, - { - "type": "uint256", - "indexed": false, - "internalType": "uint256", - "name": "amount" - } - ], - "type": "event", - "anonymous": false, - "name": "Withdraw" - }, - { - "inputs": [ - { - "name": "subAccountId", - "internalType": "uint256", - "type": "uint256" - }, - { - "type": "address", - "internalType": "address", - "name": "spender" - }, - { - "type": "uint256", - "internalType": "uint256", - "name": "amount" - } - ], - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ], - "type": "function", - "name": "approveDebt", - "stateMutability": "nonpayable" - }, - { - "type": "function", - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "inputs": [ - { - "type": "address", - "internalType": "address", - "name": "account" - } - ], - "stateMutability": "view", - "name": "balanceOf" - }, - { - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "internalType": "uint256", - "type": "uint256", - "name": "" - } - ], - "type": "function", - "name": "balanceOfExact", - "stateMutability": "view" - }, - { - "inputs": [ - { - "internalType": "uint256", - "type": "uint256", - "name": "subAccountId" - }, - { - "type": "uint256", - "internalType": "uint256", - "name": "amount" - } - ], - "outputs": [], - "type": "function", - "name": "borrow", - "stateMutability": "nonpayable" - }, - { - "name": "debtAllowance", - "stateMutability": "view", - "outputs": [ - { - "internalType": "uint256", - "type": "uint256", - "name": "" - } - ], - "inputs": [ - { - "name": "holder", - "internalType": "address", - "type": "address" - }, - { - "name": "spender", - "type": "address", - "internalType": "address" - } - ], - "type": "function" - }, - { - "outputs": [ - { - "name": "", - "type": "uint8", - "internalType": "uint8" - } - ], - "inputs": [], - "type": "function", - "name": "decimals", - "stateMutability": "pure" - }, - { - "name": "moduleGitCommit", - "stateMutability": "view", - "outputs": [ - { - "internalType": "bytes32", - "type": "bytes32", - "name": "" - } - ], - "inputs": [], - "type": "function" - }, - { - "name": "moduleId", - "stateMutability": "view", - "outputs": [ - { - "type": "uint256", - "internalType": "uint256", - "name": "" - } - ], - "inputs": [], - "type": "function" - }, - { - "name": "name", - "stateMutability": "view", - "outputs": [ - { - "type": "string", - "internalType": "string", - "name": "" - } - ], - "inputs": [], - "type": "function" - }, - { - "type": "function", - "inputs": [ - { - "type": "uint256", - "internalType": "uint256", - "name": "subAccountId" - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable", - "name": "repay" - }, - { - "name": "symbol", - "stateMutability": "view", - "outputs": [ - { - "internalType": "string", - "type": "string", - "name": "" - } - ], - "inputs": [], - "type": "function" - }, - { - "type": "function", - "inputs": [], - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ], - "stateMutability": "view", - "name": "totalSupply" - }, - { - "stateMutability": "view", - "name": "totalSupplyExact", - "type": "function", - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "inputs": [] - }, - { - "stateMutability": "nonpayable", - "name": "transfer", - "type": "function", - "outputs": [ - { - "type": "bool", - "internalType": "bool", - "name": "" - } - ], - "inputs": [ - { - "internalType": "address", - "type": "address", - "name": "to" - }, - { - "type": "uint256", - "internalType": "uint256", - "name": "amount" - } - ] - }, - { - "stateMutability": "nonpayable", - "name": "transferFrom", - "type": "function", - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "inputs": [ - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256" - } - ] - } -] diff --git a/src/apps/euler/contracts/abis/euler-etoken-contract.json b/src/apps/euler/contracts/abis/euler-etoken-contract.json deleted file mode 100644 index c6f19bc1c..000000000 --- a/src/apps/euler/contracts/abis/euler-etoken-contract.json +++ /dev/null @@ -1,1348 +0,0 @@ -[ - { - "stateMutability": "nonpayable", - "inputs": [ - { - "internalType": "bytes32", - "type": "bytes32", - "name": "moduleGitCommit_" - } - ], - "type": "constructor" - }, - { - "name": "Approval", - "anonymous": false, - "type": "event", - "inputs": [ - { - "name": "owner", - "internalType": "address", - "indexed": true, - "type": "address" - }, - { - "name": "spender", - "internalType": "address", - "indexed": true, - "type": "address" - }, - { - "type": "uint256", - "indexed": false, - "internalType": "uint256", - "name": "value" - } - ] - }, - { - "anonymous": false, - "name": "AssetStatus", - "inputs": [ - { - "type": "address", - "indexed": true, - "internalType": "address", - "name": "underlying" - }, - { - "internalType": "uint256", - "indexed": false, - "type": "uint256", - "name": "totalBalances" - }, - { - "internalType": "uint256", - "indexed": false, - "type": "uint256", - "name": "totalBorrows" - }, - { - "indexed": false, - "internalType": "uint96", - "type": "uint96", - "name": "reserveBalance" - }, - { - "type": "uint256", - "internalType": "uint256", - "indexed": false, - "name": "poolSize" - }, - { - "name": "interestAccumulator", - "type": "uint256", - "internalType": "uint256", - "indexed": false - }, - { - "indexed": false, - "internalType": "int96", - "type": "int96", - "name": "interestRate" - }, - { - "name": "timestamp", - "type": "uint256", - "internalType": "uint256", - "indexed": false - } - ], - "type": "event" - }, - { - "name": "Borrow", - "anonymous": false, - "type": "event", - "inputs": [ - { - "name": "underlying", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "type": "address", - "indexed": true, - "internalType": "address", - "name": "account" - }, - { - "name": "amount", - "indexed": false, - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "type": "event", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "delegate" - } - ], - "name": "DelegateAverageLiquidity", - "anonymous": false - }, - { - "anonymous": false, - "name": "Deposit", - "type": "event", - "inputs": [ - { - "name": "underlying", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "indexed": true, - "internalType": "address", - "type": "address", - "name": "account" - }, - { - "type": "uint256", - "indexed": false, - "internalType": "uint256", - "name": "amount" - } - ] - }, - { - "type": "event", - "inputs": [ - { - "name": "underlying", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "account" - } - ], - "name": "EnterMarket", - "anonymous": false - }, - { - "type": "event", - "inputs": [ - { - "name": "underlying", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "indexed": true, - "internalType": "address", - "type": "address", - "name": "account" - } - ], - "name": "ExitMarket", - "anonymous": false - }, - { - "name": "Genesis", - "anonymous": false, - "inputs": [], - "type": "event" - }, - { - "name": "GovConvertReserves", - "anonymous": false, - "type": "event", - "inputs": [ - { - "name": "underlying", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "recipient", - "internalType": "address", - "indexed": true, - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "type": "uint256", - "name": "amount" - } - ] - }, - { - "inputs": [ - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "underlying" - }, - { - "indexed": false, - "internalType": "struct Storage.AssetConfig", - "type": "tuple", - "name": "newConfig", - "components": [ - { - "name": "eTokenAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "borrowIsolated", - "internalType": "bool", - "type": "bool" - }, - { - "internalType": "uint32", - "type": "uint32", - "name": "collateralFactor" - }, - { - "internalType": "uint32", - "type": "uint32", - "name": "borrowFactor" - }, - { - "internalType": "uint24", - "type": "uint24", - "name": "twapWindow" - } - ] - } - ], - "type": "event", - "name": "GovSetAssetConfig", - "anonymous": false - }, - { - "name": "GovSetIRM", - "anonymous": false, - "inputs": [ - { - "name": "underlying", - "indexed": true, - "internalType": "address", - "type": "address" - }, - { - "type": "uint256", - "internalType": "uint256", - "indexed": false, - "name": "interestRateModel" - }, - { - "name": "resetParams", - "type": "bytes", - "indexed": false, - "internalType": "bytes" - } - ], - "type": "event" - }, - { - "inputs": [ - { - "name": "underlying", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "indexed": false, - "internalType": "uint16", - "type": "uint16", - "name": "newPricingType" - }, - { - "name": "newPricingParameter", - "type": "uint32", - "indexed": false, - "internalType": "uint32" - } - ], - "type": "event", - "name": "GovSetPricingConfig", - "anonymous": false - }, - { - "anonymous": false, - "name": "GovSetReserveFee", - "inputs": [ - { - "indexed": true, - "internalType": "address", - "type": "address", - "name": "underlying" - }, - { - "indexed": false, - "internalType": "uint32", - "type": "uint32", - "name": "newReserveFee" - } - ], - "type": "event" - }, - { - "anonymous": false, - "name": "InstallerInstallModule", - "inputs": [ - { - "name": "moduleId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "internalType": "address", - "indexed": true, - "type": "address", - "name": "moduleImpl" - }, - { - "internalType": "bytes32", - "indexed": false, - "type": "bytes32", - "name": "moduleGitCommit" - } - ], - "type": "event" - }, - { - "inputs": [ - { - "type": "address", - "indexed": true, - "internalType": "address", - "name": "newGovernorAdmin" - } - ], - "type": "event", - "name": "InstallerSetGovernorAdmin", - "anonymous": false - }, - { - "name": "InstallerSetUpgradeAdmin", - "anonymous": false, - "type": "event", - "inputs": [ - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "newUpgradeAdmin" - } - ] - }, - { - "inputs": [ - { - "name": "liquidator", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "type": "address", - "indexed": true, - "internalType": "address", - "name": "violator" - }, - { - "indexed": true, - "internalType": "address", - "type": "address", - "name": "underlying" - }, - { - "name": "collateral", - "internalType": "address", - "indexed": false, - "type": "address" - }, - { - "type": "uint256", - "indexed": false, - "internalType": "uint256", - "name": "repay" - }, - { - "type": "uint256", - "indexed": false, - "internalType": "uint256", - "name": "yield" - }, - { - "name": "healthScore", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "baseDiscount", - "indexed": false, - "internalType": "uint256", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "type": "uint256", - "name": "discount" - } - ], - "type": "event", - "anonymous": false, - "name": "Liquidation" - }, - { - "type": "event", - "inputs": [ - { - "indexed": true, - "internalType": "address", - "type": "address", - "name": "underlying" - }, - { - "name": "eToken", - "indexed": true, - "internalType": "address", - "type": "address" - }, - { - "name": "dToken", - "internalType": "address", - "indexed": true, - "type": "address" - } - ], - "anonymous": false, - "name": "MarketActivated" - }, - { - "type": "event", - "inputs": [ - { - "internalType": "address", - "indexed": true, - "type": "address", - "name": "underlying" - }, - { - "name": "pToken", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false, - "name": "PTokenActivated" - }, - { - "inputs": [ - { - "name": "underlying", - "internalType": "address", - "indexed": true, - "type": "address" - }, - { - "name": "account", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "type": "uint256", - "indexed": false, - "internalType": "uint256", - "name": "amount" - } - ], - "type": "event", - "name": "PTokenUnWrap", - "anonymous": false - }, - { - "anonymous": false, - "name": "PTokenWrap", - "inputs": [ - { - "name": "underlying", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "account" - }, - { - "type": "uint256", - "internalType": "uint256", - "indexed": false, - "name": "amount" - } - ], - "type": "event" - }, - { - "type": "event", - "inputs": [ - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "proxy" - }, - { - "name": "moduleId", - "internalType": "uint256", - "indexed": false, - "type": "uint256" - } - ], - "name": "ProxyCreated", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "indexed": true, - "type": "address", - "name": "underlying" - }, - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "account" - }, - { - "indexed": false, - "internalType": "uint256", - "type": "uint256", - "name": "amount" - } - ], - "type": "event", - "anonymous": false, - "name": "Repay" - }, - { - "inputs": [ - { - "indexed": true, - "internalType": "address", - "type": "address", - "name": "account" - }, - { - "indexed": false, - "internalType": "uint256", - "type": "uint256", - "name": "amount" - } - ], - "type": "event", - "name": "RequestBorrow", - "anonymous": false - }, - { - "inputs": [ - { - "type": "address", - "indexed": true, - "internalType": "address", - "name": "account" - }, - { - "type": "uint256", - "indexed": false, - "internalType": "uint256", - "name": "amount" - } - ], - "type": "event", - "name": "RequestBurn", - "anonymous": false - }, - { - "type": "event", - "inputs": [ - { - "internalType": "address", - "indexed": true, - "type": "address", - "name": "account" - }, - { - "type": "uint256", - "indexed": false, - "internalType": "uint256", - "name": "amount" - } - ], - "anonymous": false, - "name": "RequestDeposit" - }, - { - "type": "event", - "inputs": [ - { - "name": "liquidator", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "violator", - "internalType": "address", - "indexed": true, - "type": "address" - }, - { - "name": "underlying", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "internalType": "address", - "indexed": false, - "type": "address", - "name": "collateral" - }, - { - "indexed": false, - "internalType": "uint256", - "type": "uint256", - "name": "repay" - }, - { - "type": "uint256", - "indexed": false, - "internalType": "uint256", - "name": "minYield" - } - ], - "name": "RequestLiquidate", - "anonymous": false - }, - { - "name": "RequestMint", - "anonymous": false, - "type": "event", - "inputs": [ - { - "name": "account", - "internalType": "address", - "indexed": true, - "type": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ] - }, - { - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "type": "event", - "anonymous": false, - "name": "RequestRepay" - }, - { - "inputs": [ - { - "name": "accountIn", - "internalType": "address", - "indexed": true, - "type": "address" - }, - { - "internalType": "address", - "indexed": true, - "type": "address", - "name": "accountOut" - }, - { - "name": "underlyingIn", - "internalType": "address", - "indexed": true, - "type": "address" - }, - { - "name": "underlyingOut", - "indexed": false, - "internalType": "address", - "type": "address" - }, - { - "internalType": "uint256", - "indexed": false, - "type": "uint256", - "name": "amount" - }, - { - "type": "uint256", - "internalType": "uint256", - "indexed": false, - "name": "swapType" - } - ], - "type": "event", - "name": "RequestSwap", - "anonymous": false - }, - { - "type": "event", - "inputs": [ - { - "name": "from", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "name": "to", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "type": "uint256", - "indexed": false, - "internalType": "uint256", - "name": "amount" - } - ], - "name": "RequestTransferDToken", - "anonymous": false - }, - { - "inputs": [ - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "from" - }, - { - "name": "to", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "name": "amount", - "internalType": "uint256", - "indexed": false, - "type": "uint256" - } - ], - "type": "event", - "name": "RequestTransferEToken", - "anonymous": false - }, - { - "anonymous": false, - "name": "RequestWithdraw", - "inputs": [ - { - "type": "address", - "indexed": true, - "internalType": "address", - "name": "account" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "type": "event" - }, - { - "name": "TrackAverageLiquidity", - "anonymous": false, - "type": "event", - "inputs": [ - { - "name": "account", - "internalType": "address", - "indexed": true, - "type": "address" - } - ] - }, - { - "anonymous": false, - "name": "Transfer", - "type": "event", - "inputs": [ - { - "indexed": true, - "internalType": "address", - "type": "address", - "name": "from" - }, - { - "name": "to", - "indexed": true, - "internalType": "address", - "type": "address" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256", - "indexed": false - } - ] - }, - { - "name": "UnTrackAverageLiquidity", - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "type": "address", - "name": "account" - } - ], - "type": "event" - }, - { - "anonymous": false, - "name": "Withdraw", - "type": "event", - "inputs": [ - { - "indexed": true, - "internalType": "address", - "type": "address", - "name": "underlying" - }, - { - "type": "address", - "internalType": "address", - "indexed": true, - "name": "account" - }, - { - "name": "amount", - "indexed": false, - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "type": "function", - "inputs": [ - { - "name": "holder", - "type": "address", - "internalType": "address" - }, - { - "name": "spender", - "internalType": "address", - "type": "address" - } - ], - "outputs": [ - { - "type": "uint256", - "internalType": "uint256", - "name": "" - } - ], - "stateMutability": "view", - "name": "allowance" - }, - { - "stateMutability": "nonpayable", - "name": "approve", - "type": "function", - "inputs": [ - { - "internalType": "address", - "type": "address", - "name": "spender" - }, - { - "type": "uint256", - "internalType": "uint256", - "name": "amount" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ] - }, - { - "outputs": [ - { - "internalType": "bool", - "type": "bool", - "name": "" - } - ], - "inputs": [ - { - "name": "subAccountId", - "internalType": "uint256", - "type": "uint256" - }, - { - "internalType": "address", - "type": "address", - "name": "spender" - }, - { - "type": "uint256", - "internalType": "uint256", - "name": "amount" - } - ], - "type": "function", - "name": "approveSubAccount", - "stateMutability": "nonpayable" - }, - { - "type": "function", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view", - "name": "balanceOf" - }, - { - "name": "balanceOfUnderlying", - "stateMutability": "view", - "outputs": [ - { - "internalType": "uint256", - "type": "uint256", - "name": "" - } - ], - "inputs": [ - { - "name": "account", - "internalType": "address", - "type": "address" - } - ], - "type": "function" - }, - { - "stateMutability": "nonpayable", - "name": "burn", - "type": "function", - "outputs": [], - "inputs": [ - { - "name": "subAccountId", - "internalType": "uint256", - "type": "uint256" - }, - { - "type": "uint256", - "internalType": "uint256", - "name": "amount" - } - ] - }, - { - "name": "convertBalanceToUnderlying", - "stateMutability": "view", - "inputs": [ - { - "name": "balance", - "internalType": "uint256", - "type": "uint256" - } - ], - "outputs": [ - { - "internalType": "uint256", - "type": "uint256", - "name": "" - } - ], - "type": "function" - }, - { - "stateMutability": "view", - "name": "convertUnderlyingToBalance", - "type": "function", - "inputs": [ - { - "name": "underlyingAmount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ] - }, - { - "inputs": [], - "outputs": [ - { - "name": "", - "internalType": "uint8", - "type": "uint8" - } - ], - "type": "function", - "name": "decimals", - "stateMutability": "pure" - }, - { - "type": "function", - "inputs": [ - { - "name": "subAccountId", - "type": "uint256", - "internalType": "uint256" - }, - { - "internalType": "uint256", - "type": "uint256", - "name": "amount" - } - ], - "outputs": [], - "stateMutability": "nonpayable", - "name": "deposit" - }, - { - "name": "mint", - "stateMutability": "nonpayable", - "inputs": [ - { - "type": "uint256", - "internalType": "uint256", - "name": "subAccountId" - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256" - } - ], - "outputs": [], - "type": "function" - }, - { - "stateMutability": "view", - "name": "moduleGitCommit", - "type": "function", - "inputs": [], - "outputs": [ - { - "internalType": "bytes32", - "type": "bytes32", - "name": "" - } - ] - }, - { - "stateMutability": "view", - "name": "moduleId", - "type": "function", - "outputs": [ - { - "type": "uint256", - "internalType": "uint256", - "name": "" - } - ], - "inputs": [] - }, - { - "inputs": [], - "outputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ], - "type": "function", - "name": "name", - "stateMutability": "view" - }, - { - "stateMutability": "view", - "name": "reserveBalance", - "type": "function", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "inputs": [], - "outputs": [ - { - "name": "", - "internalType": "uint256", - "type": "uint256" - } - ], - "type": "function", - "name": "reserveBalanceUnderlying", - "stateMutability": "view" - }, - { - "inputs": [], - "outputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ], - "type": "function", - "name": "symbol", - "stateMutability": "view" - }, - { - "inputs": [], - "outputs": [ - { - "type": "uint256", - "internalType": "uint256", - "name": "" - } - ], - "type": "function", - "name": "totalSupply", - "stateMutability": "view" - }, - { - "type": "function", - "outputs": [ - { - "internalType": "uint256", - "type": "uint256", - "name": "" - } - ], - "inputs": [], - "stateMutability": "view", - "name": "totalSupplyUnderlying" - }, - { - "name": "touch", - "stateMutability": "nonpayable", - "inputs": [], - "outputs": [], - "type": "function" - }, - { - "stateMutability": "nonpayable", - "name": "transfer", - "type": "function", - "outputs": [ - { - "internalType": "bool", - "type": "bool", - "name": "" - } - ], - "inputs": [ - { - "name": "to", - "internalType": "address", - "type": "address" - }, - { - "type": "uint256", - "internalType": "uint256", - "name": "amount" - } - ] - }, - { - "type": "function", - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ], - "inputs": [ - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "to", - "type": "address", - "internalType": "address" - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "name": "transferFrom" - }, - { - "type": "function", - "inputs": [ - { - "internalType": "address", - "type": "address", - "name": "from" - }, - { - "name": "to", - "internalType": "address", - "type": "address" - } - ], - "outputs": [ - { - "internalType": "bool", - "type": "bool", - "name": "" - } - ], - "stateMutability": "nonpayable", - "name": "transferFromMax" - }, - { - "stateMutability": "nonpayable", - "name": "withdraw", - "type": "function", - "inputs": [ - { - "internalType": "uint256", - "type": "uint256", - "name": "subAccountId" - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256" - } - ], - "outputs": [] - } -] diff --git a/src/apps/euler/contracts/abis/euler-ptoken-contract.json b/src/apps/euler/contracts/abis/euler-ptoken-contract.json deleted file mode 100644 index 626d0c70a..000000000 --- a/src/apps/euler/contracts/abis/euler-ptoken-contract.json +++ /dev/null @@ -1,310 +0,0 @@ -[ - { - "inputs": [ - { - "name": "euler_", - "type": "address", - "internalType": "address" - }, - { - "name": "underlying_", - "type": "address", - "internalType": "address" - } - ], - "type": "constructor", - "stateMutability": "nonpayable" - }, - { - "anonymous": false, - "name": "Approval", - "inputs": [ - { - "name": "owner", - "type": "address", - "internalType": "address", - "indexed": true - }, - { - "name": "spender", - "indexed": true, - "internalType": "address", - "type": "address" - }, - { - "name": "value", - "internalType": "uint256", - "indexed": false, - "type": "uint256" - } - ], - "type": "event" - }, - { - "inputs": [ - { - "name": "from", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "to", - "indexed": true, - "internalType": "address", - "type": "address" - }, - { - "name": "value", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "type": "event", - "name": "Transfer", - "anonymous": false - }, - { - "name": "allowance", - "stateMutability": "view", - "outputs": [ - { - "type": "uint256", - "internalType": "uint256", - "name": "" - } - ], - "inputs": [ - { - "internalType": "address", - "type": "address", - "name": "holder" - }, - { - "internalType": "address", - "type": "address", - "name": "spender" - } - ], - "type": "function" - }, - { - "stateMutability": "nonpayable", - "name": "approve", - "type": "function", - "inputs": [ - { - "type": "address", - "internalType": "address", - "name": "spender" - }, - { - "internalType": "uint256", - "type": "uint256", - "name": "amount" - } - ], - "outputs": [ - { - "internalType": "bool", - "type": "bool", - "name": "" - } - ] - }, - { - "name": "balanceOf", - "stateMutability": "view", - "outputs": [ - { - "internalType": "uint256", - "type": "uint256", - "name": "" - } - ], - "inputs": [ - { - "name": "who", - "type": "address", - "internalType": "address" - } - ], - "type": "function" - }, - { - "name": "claimSurplus", - "stateMutability": "nonpayable", - "inputs": [ - { - "name": "who", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "type": "function" - }, - { - "inputs": [], - "outputs": [ - { - "type": "uint8", - "internalType": "uint8", - "name": "" - } - ], - "type": "function", - "name": "decimals", - "stateMutability": "view" - }, - { - "name": "forceUnwrap", - "stateMutability": "nonpayable", - "inputs": [ - { - "type": "address", - "internalType": "address", - "name": "who" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "type": "function" - }, - { - "name": "name", - "stateMutability": "view", - "inputs": [], - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ], - "type": "function" - }, - { - "stateMutability": "view", - "name": "symbol", - "type": "function", - "inputs": [], - "outputs": [ - { - "name": "", - "internalType": "string", - "type": "string" - } - ] - }, - { - "stateMutability": "view", - "name": "totalSupply", - "type": "function", - "outputs": [ - { - "internalType": "uint256", - "type": "uint256", - "name": "" - } - ], - "inputs": [] - }, - { - "inputs": [ - { - "name": "recipient", - "type": "address", - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "internalType": "bool", - "type": "bool" - } - ], - "type": "function", - "name": "transfer", - "stateMutability": "nonpayable" - }, - { - "inputs": [ - { - "internalType": "address", - "type": "address", - "name": "from" - }, - { - "internalType": "address", - "type": "address", - "name": "recipient" - }, - { - "name": "amount", - "internalType": "uint256", - "type": "uint256" - } - ], - "outputs": [ - { - "internalType": "bool", - "type": "bool", - "name": "" - } - ], - "type": "function", - "name": "transferFrom", - "stateMutability": "nonpayable" - }, - { - "type": "function", - "outputs": [ - { - "name": "", - "internalType": "address", - "type": "address" - } - ], - "inputs": [], - "stateMutability": "view", - "name": "underlying" - }, - { - "outputs": [], - "inputs": [ - { - "internalType": "uint256", - "type": "uint256", - "name": "amount" - } - ], - "type": "function", - "name": "unwrap", - "stateMutability": "nonpayable" - }, - { - "name": "wrap", - "stateMutability": "nonpayable", - "inputs": [ - { - "type": "uint256", - "internalType": "uint256", - "name": "amount" - } - ], - "outputs": [], - "type": "function" - } -] diff --git a/src/apps/euler/contracts/abis/euler-staking-rewards-contract.json b/src/apps/euler/contracts/abis/euler-staking-rewards-contract.json deleted file mode 100644 index 0f44bd24a..000000000 --- a/src/apps/euler/contracts/abis/euler-staking-rewards-contract.json +++ /dev/null @@ -1,310 +0,0 @@ -[ - { - "inputs": [ - { "internalType": "address", "name": "_owner", "type": "address" }, - { "internalType": "address", "name": "_rewardsDistribution", "type": "address" }, - { "internalType": "address", "name": "_rewardsToken", "type": "address" }, - { "internalType": "address", "name": "_stakingToken", "type": "address" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "oldOwner", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "newOwner", "type": "address" } - ], - "name": "OwnerChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "newOwner", "type": "address" }], - "name": "OwnerNominated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "bool", "name": "isPaused", "type": "bool" }], - "name": "PauseChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "token", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256", "name": "reward", "type": "uint256" }], - "name": "RewardAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "reward", "type": "uint256" } - ], - "name": "RewardPaid", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256", "name": "newDuration", "type": "uint256" }], - "name": "RewardsDurationUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "Staked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "Withdrawn", - "type": "event" - }, - { "inputs": [], "name": "acceptOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], - "name": "earned", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "subAccountId", "type": "uint256" }], - "name": "exit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { "inputs": [], "name": "exit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { "inputs": [], "name": "getReward", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "getRewardForDuration", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lastPauseTime", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lastTimeRewardApplicable", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "lastUpdateTime", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_owner", "type": "address" }], - "name": "nominateNewOwner", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "nominatedOwner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "reward", "type": "uint256" }], - "name": "notifyRewardAmount", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "periodFinish", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "tokenAddress", "type": "address" }, - { "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } - ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerToken", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardPerTokenStored", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardRate", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "rewards", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardsDistribution", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardsDuration", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardsToken", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "bool", "name": "_paused", "type": "bool" }], - "name": "setPaused", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_rewardsDistribution", "type": "address" }], - "name": "setRewardsDistribution", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_rewardsDuration", "type": "uint256" }], - "name": "setRewardsDuration", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "subAccountId", "type": "uint256" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "stake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "stake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "stakingToken", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "userRewardPerTokenPaid", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "subAccountId", "type": "uint256" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/euler/contracts/index.ts b/src/apps/euler/contracts/index.ts deleted file mode 100644 index 5dcfebdf6..000000000 --- a/src/apps/euler/contracts/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -export * from './viem.contract-factory'; diff --git a/src/apps/euler/contracts/viem.contract-factory.ts b/src/apps/euler/contracts/viem.contract-factory.ts deleted file mode 100644 index af0227142..000000000 --- a/src/apps/euler/contracts/viem.contract-factory.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Injectable, Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { Network } from '~types/network.interface'; - -import { - EulerDtokenContract__factory, - EulerEtokenContract__factory, - EulerPtokenContract__factory, - EulerStakingRewardsContract__factory, -} from './viem'; - -type ContractOpts = { address: string; network: Network }; - -@Injectable() -export class EulerViemContractFactory { - constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) {} - - eulerDtokenContract({ address, network }: ContractOpts) { - return EulerDtokenContract__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - eulerEtokenContract({ address, network }: ContractOpts) { - return EulerEtokenContract__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - eulerPtokenContract({ address, network }: ContractOpts) { - return EulerPtokenContract__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - eulerStakingRewardsContract({ address, network }: ContractOpts) { - return EulerStakingRewardsContract__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } -} diff --git a/src/apps/euler/contracts/viem/EulerDtokenContract.ts b/src/apps/euler/contracts/viem/EulerDtokenContract.ts deleted file mode 100644 index c8af02e50..000000000 --- a/src/apps/euler/contracts/viem/EulerDtokenContract.ts +++ /dev/null @@ -1,1207 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const eulerDtokenContractAbi = [ - { - stateMutability: 'nonpayable', - inputs: [ - { - type: 'bytes32', - internalType: 'bytes32', - name: 'moduleGitCommit_', - }, - ], - type: 'constructor', - }, - { - type: 'event', - inputs: [ - { - name: 'owner', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - indexed: true, - internalType: 'address', - type: 'address', - name: 'spender', - }, - { - name: 'value', - internalType: 'uint256', - indexed: false, - type: 'uint256', - }, - ], - name: 'Approval', - anonymous: false, - }, - { - inputs: [ - { - internalType: 'address', - indexed: true, - type: 'address', - name: 'underlying', - }, - { - type: 'uint256', - internalType: 'uint256', - indexed: false, - name: 'totalBalances', - }, - { - name: 'totalBorrows', - type: 'uint256', - internalType: 'uint256', - indexed: false, - }, - { - internalType: 'uint96', - indexed: false, - type: 'uint96', - name: 'reserveBalance', - }, - { - name: 'poolSize', - type: 'uint256', - internalType: 'uint256', - indexed: false, - }, - { - name: 'interestAccumulator', - indexed: false, - internalType: 'uint256', - type: 'uint256', - }, - { - name: 'interestRate', - type: 'int96', - internalType: 'int96', - indexed: false, - }, - { - name: 'timestamp', - indexed: false, - internalType: 'uint256', - type: 'uint256', - }, - ], - type: 'event', - anonymous: false, - name: 'AssetStatus', - }, - { - anonymous: false, - name: 'Borrow', - inputs: [ - { - name: 'underlying', - type: 'address', - indexed: true, - internalType: 'address', - }, - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'account', - }, - { - name: 'amount', - type: 'uint256', - internalType: 'uint256', - indexed: false, - }, - ], - type: 'event', - }, - { - name: 'DelegateAverageLiquidity', - anonymous: false, - inputs: [ - { - name: 'account', - indexed: true, - internalType: 'address', - type: 'address', - }, - { - name: 'delegate', - indexed: true, - internalType: 'address', - type: 'address', - }, - ], - type: 'event', - }, - { - name: 'Deposit', - anonymous: false, - type: 'event', - inputs: [ - { - name: 'underlying', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - type: 'address', - indexed: true, - internalType: 'address', - name: 'account', - }, - { - internalType: 'uint256', - indexed: false, - type: 'uint256', - name: 'amount', - }, - ], - }, - { - type: 'event', - inputs: [ - { - type: 'address', - indexed: true, - internalType: 'address', - name: 'underlying', - }, - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'account', - }, - ], - name: 'EnterMarket', - anonymous: false, - }, - { - anonymous: false, - name: 'ExitMarket', - inputs: [ - { - type: 'address', - indexed: true, - internalType: 'address', - name: 'underlying', - }, - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'account', - }, - ], - type: 'event', - }, - { - name: 'Genesis', - anonymous: false, - type: 'event', - inputs: [], - }, - { - type: 'event', - inputs: [ - { - name: 'underlying', - indexed: true, - internalType: 'address', - type: 'address', - }, - { - name: 'recipient', - internalType: 'address', - indexed: true, - type: 'address', - }, - { - name: 'amount', - type: 'uint256', - indexed: false, - internalType: 'uint256', - }, - ], - name: 'GovConvertReserves', - anonymous: false, - }, - { - type: 'event', - inputs: [ - { - type: 'address', - indexed: true, - internalType: 'address', - name: 'underlying', - }, - { - internalType: 'struct Storage.AssetConfig', - indexed: false, - type: 'tuple', - name: 'newConfig', - components: [ - { - internalType: 'address', - type: 'address', - name: 'eTokenAddress', - }, - { - type: 'bool', - internalType: 'bool', - name: 'borrowIsolated', - }, - { - internalType: 'uint32', - type: 'uint32', - name: 'collateralFactor', - }, - { - name: 'borrowFactor', - internalType: 'uint32', - type: 'uint32', - }, - { - internalType: 'uint24', - type: 'uint24', - name: 'twapWindow', - }, - ], - }, - ], - name: 'GovSetAssetConfig', - anonymous: false, - }, - { - name: 'GovSetIRM', - anonymous: false, - type: 'event', - inputs: [ - { - name: 'underlying', - indexed: true, - internalType: 'address', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - type: 'uint256', - name: 'interestRateModel', - }, - { - indexed: false, - internalType: 'bytes', - type: 'bytes', - name: 'resetParams', - }, - ], - }, - { - name: 'GovSetPricingConfig', - anonymous: false, - inputs: [ - { - name: 'underlying', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - type: 'uint16', - indexed: false, - internalType: 'uint16', - name: 'newPricingType', - }, - { - type: 'uint32', - internalType: 'uint32', - indexed: false, - name: 'newPricingParameter', - }, - ], - type: 'event', - }, - { - type: 'event', - inputs: [ - { - name: 'underlying', - type: 'address', - indexed: true, - internalType: 'address', - }, - { - name: 'newReserveFee', - indexed: false, - internalType: 'uint32', - type: 'uint32', - }, - ], - anonymous: false, - name: 'GovSetReserveFee', - }, - { - anonymous: false, - name: 'InstallerInstallModule', - inputs: [ - { - type: 'uint256', - indexed: true, - internalType: 'uint256', - name: 'moduleId', - }, - { - indexed: true, - internalType: 'address', - type: 'address', - name: 'moduleImpl', - }, - { - name: 'moduleGitCommit', - internalType: 'bytes32', - indexed: false, - type: 'bytes32', - }, - ], - type: 'event', - }, - { - type: 'event', - inputs: [ - { - indexed: true, - internalType: 'address', - type: 'address', - name: 'newGovernorAdmin', - }, - ], - anonymous: false, - name: 'InstallerSetGovernorAdmin', - }, - { - inputs: [ - { - name: 'newUpgradeAdmin', - type: 'address', - internalType: 'address', - indexed: true, - }, - ], - type: 'event', - anonymous: false, - name: 'InstallerSetUpgradeAdmin', - }, - { - type: 'event', - inputs: [ - { - internalType: 'address', - indexed: true, - type: 'address', - name: 'liquidator', - }, - { - name: 'violator', - internalType: 'address', - indexed: true, - type: 'address', - }, - { - type: 'address', - indexed: true, - internalType: 'address', - name: 'underlying', - }, - { - type: 'address', - internalType: 'address', - indexed: false, - name: 'collateral', - }, - { - name: 'repay', - type: 'uint256', - indexed: false, - internalType: 'uint256', - }, - { - type: 'uint256', - internalType: 'uint256', - indexed: false, - name: 'yield', - }, - { - name: 'healthScore', - type: 'uint256', - internalType: 'uint256', - indexed: false, - }, - { - name: 'baseDiscount', - type: 'uint256', - indexed: false, - internalType: 'uint256', - }, - { - type: 'uint256', - internalType: 'uint256', - indexed: false, - name: 'discount', - }, - ], - anonymous: false, - name: 'Liquidation', - }, - { - type: 'event', - inputs: [ - { - internalType: 'address', - indexed: true, - type: 'address', - name: 'underlying', - }, - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'eToken', - }, - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'dToken', - }, - ], - name: 'MarketActivated', - anonymous: false, - }, - { - name: 'PTokenActivated', - anonymous: false, - inputs: [ - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'underlying', - }, - { - name: 'pToken', - type: 'address', - internalType: 'address', - indexed: true, - }, - ], - type: 'event', - }, - { - anonymous: false, - name: 'PTokenUnWrap', - inputs: [ - { - name: 'underlying', - internalType: 'address', - indexed: true, - type: 'address', - }, - { - type: 'address', - indexed: true, - internalType: 'address', - name: 'account', - }, - { - internalType: 'uint256', - indexed: false, - type: 'uint256', - name: 'amount', - }, - ], - type: 'event', - }, - { - name: 'PTokenWrap', - anonymous: false, - inputs: [ - { - name: 'underlying', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - indexed: true, - internalType: 'address', - type: 'address', - name: 'account', - }, - { - type: 'uint256', - internalType: 'uint256', - indexed: false, - name: 'amount', - }, - ], - type: 'event', - }, - { - anonymous: false, - name: 'ProxyCreated', - type: 'event', - inputs: [ - { - type: 'address', - indexed: true, - internalType: 'address', - name: 'proxy', - }, - { - indexed: false, - internalType: 'uint256', - type: 'uint256', - name: 'moduleId', - }, - ], - }, - { - name: 'Repay', - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - type: 'address', - name: 'underlying', - }, - { - name: 'account', - indexed: true, - internalType: 'address', - type: 'address', - }, - { - name: 'amount', - internalType: 'uint256', - indexed: false, - type: 'uint256', - }, - ], - type: 'event', - }, - { - name: 'RequestBorrow', - anonymous: false, - type: 'event', - inputs: [ - { - name: 'account', - internalType: 'address', - indexed: true, - type: 'address', - }, - { - name: 'amount', - internalType: 'uint256', - indexed: false, - type: 'uint256', - }, - ], - }, - { - name: 'RequestBurn', - anonymous: false, - inputs: [ - { - name: 'account', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - name: 'amount', - type: 'uint256', - indexed: false, - internalType: 'uint256', - }, - ], - type: 'event', - }, - { - type: 'event', - inputs: [ - { - indexed: true, - internalType: 'address', - type: 'address', - name: 'account', - }, - { - name: 'amount', - indexed: false, - internalType: 'uint256', - type: 'uint256', - }, - ], - name: 'RequestDeposit', - anonymous: false, - }, - { - inputs: [ - { - internalType: 'address', - indexed: true, - type: 'address', - name: 'liquidator', - }, - { - name: 'violator', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - name: 'underlying', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - name: 'collateral', - indexed: false, - internalType: 'address', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - type: 'uint256', - name: 'repay', - }, - { - type: 'uint256', - internalType: 'uint256', - indexed: false, - name: 'minYield', - }, - ], - type: 'event', - anonymous: false, - name: 'RequestLiquidate', - }, - { - inputs: [ - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'account', - }, - { - name: 'amount', - type: 'uint256', - internalType: 'uint256', - indexed: false, - }, - ], - type: 'event', - name: 'RequestMint', - anonymous: false, - }, - { - name: 'RequestRepay', - anonymous: false, - inputs: [ - { - internalType: 'address', - indexed: true, - type: 'address', - name: 'account', - }, - { - name: 'amount', - type: 'uint256', - indexed: false, - internalType: 'uint256', - }, - ], - type: 'event', - }, - { - anonymous: false, - name: 'RequestSwap', - inputs: [ - { - indexed: true, - internalType: 'address', - type: 'address', - name: 'accountIn', - }, - { - name: 'accountOut', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - internalType: 'address', - indexed: true, - type: 'address', - name: 'underlyingIn', - }, - { - internalType: 'address', - indexed: false, - type: 'address', - name: 'underlyingOut', - }, - { - type: 'uint256', - indexed: false, - internalType: 'uint256', - name: 'amount', - }, - { - name: 'swapType', - internalType: 'uint256', - indexed: false, - type: 'uint256', - }, - ], - type: 'event', - }, - { - inputs: [ - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'from', - }, - { - name: 'to', - type: 'address', - indexed: true, - internalType: 'address', - }, - { - internalType: 'uint256', - indexed: false, - type: 'uint256', - name: 'amount', - }, - ], - type: 'event', - name: 'RequestTransferDToken', - anonymous: false, - }, - { - name: 'RequestTransferEToken', - anonymous: false, - inputs: [ - { - name: 'from', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - name: 'to', - type: 'address', - indexed: true, - internalType: 'address', - }, - { - name: 'amount', - internalType: 'uint256', - indexed: false, - type: 'uint256', - }, - ], - type: 'event', - }, - { - anonymous: false, - name: 'RequestWithdraw', - type: 'event', - inputs: [ - { - name: 'account', - type: 'address', - indexed: true, - internalType: 'address', - }, - { - type: 'uint256', - indexed: false, - internalType: 'uint256', - name: 'amount', - }, - ], - }, - { - anonymous: false, - name: 'TrackAverageLiquidity', - inputs: [ - { - type: 'address', - indexed: true, - internalType: 'address', - name: 'account', - }, - ], - type: 'event', - }, - { - name: 'Transfer', - anonymous: false, - type: 'event', - inputs: [ - { - name: 'from', - type: 'address', - indexed: true, - internalType: 'address', - }, - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'to', - }, - { - type: 'uint256', - indexed: false, - internalType: 'uint256', - name: 'value', - }, - ], - }, - { - inputs: [ - { - internalType: 'address', - indexed: true, - type: 'address', - name: 'account', - }, - ], - type: 'event', - anonymous: false, - name: 'UnTrackAverageLiquidity', - }, - { - inputs: [ - { - name: 'underlying', - type: 'address', - indexed: true, - internalType: 'address', - }, - { - type: 'address', - indexed: true, - internalType: 'address', - name: 'account', - }, - { - type: 'uint256', - indexed: false, - internalType: 'uint256', - name: 'amount', - }, - ], - type: 'event', - anonymous: false, - name: 'Withdraw', - }, - { - inputs: [ - { - name: 'subAccountId', - internalType: 'uint256', - type: 'uint256', - }, - { - type: 'address', - internalType: 'address', - name: 'spender', - }, - { - type: 'uint256', - internalType: 'uint256', - name: 'amount', - }, - ], - outputs: [ - { - name: '', - internalType: 'bool', - type: 'bool', - }, - ], - type: 'function', - name: 'approveDebt', - stateMutability: 'nonpayable', - }, - { - type: 'function', - outputs: [ - { - name: '', - type: 'uint256', - internalType: 'uint256', - }, - ], - inputs: [ - { - type: 'address', - internalType: 'address', - name: 'account', - }, - ], - stateMutability: 'view', - name: 'balanceOf', - }, - { - inputs: [ - { - name: 'account', - type: 'address', - internalType: 'address', - }, - ], - outputs: [ - { - internalType: 'uint256', - type: 'uint256', - name: '', - }, - ], - type: 'function', - name: 'balanceOfExact', - stateMutability: 'view', - }, - { - inputs: [ - { - internalType: 'uint256', - type: 'uint256', - name: 'subAccountId', - }, - { - type: 'uint256', - internalType: 'uint256', - name: 'amount', - }, - ], - outputs: [], - type: 'function', - name: 'borrow', - stateMutability: 'nonpayable', - }, - { - name: 'debtAllowance', - stateMutability: 'view', - outputs: [ - { - internalType: 'uint256', - type: 'uint256', - name: '', - }, - ], - inputs: [ - { - name: 'holder', - internalType: 'address', - type: 'address', - }, - { - name: 'spender', - type: 'address', - internalType: 'address', - }, - ], - type: 'function', - }, - { - outputs: [ - { - name: '', - type: 'uint8', - internalType: 'uint8', - }, - ], - inputs: [], - type: 'function', - name: 'decimals', - stateMutability: 'pure', - }, - { - name: 'moduleGitCommit', - stateMutability: 'view', - outputs: [ - { - internalType: 'bytes32', - type: 'bytes32', - name: '', - }, - ], - inputs: [], - type: 'function', - }, - { - name: 'moduleId', - stateMutability: 'view', - outputs: [ - { - type: 'uint256', - internalType: 'uint256', - name: '', - }, - ], - inputs: [], - type: 'function', - }, - { - name: 'name', - stateMutability: 'view', - outputs: [ - { - type: 'string', - internalType: 'string', - name: '', - }, - ], - inputs: [], - type: 'function', - }, - { - type: 'function', - inputs: [ - { - type: 'uint256', - internalType: 'uint256', - name: 'subAccountId', - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - }, - ], - outputs: [], - stateMutability: 'nonpayable', - name: 'repay', - }, - { - name: 'symbol', - stateMutability: 'view', - outputs: [ - { - internalType: 'string', - type: 'string', - name: '', - }, - ], - inputs: [], - type: 'function', - }, - { - type: 'function', - inputs: [], - outputs: [ - { - name: '', - internalType: 'uint256', - type: 'uint256', - }, - ], - stateMutability: 'view', - name: 'totalSupply', - }, - { - stateMutability: 'view', - name: 'totalSupplyExact', - type: 'function', - outputs: [ - { - name: '', - type: 'uint256', - internalType: 'uint256', - }, - ], - inputs: [], - }, - { - stateMutability: 'nonpayable', - name: 'transfer', - type: 'function', - outputs: [ - { - type: 'bool', - internalType: 'bool', - name: '', - }, - ], - inputs: [ - { - internalType: 'address', - type: 'address', - name: 'to', - }, - { - type: 'uint256', - internalType: 'uint256', - name: 'amount', - }, - ], - }, - { - stateMutability: 'nonpayable', - name: 'transferFrom', - type: 'function', - outputs: [ - { - name: '', - type: 'bool', - internalType: 'bool', - }, - ], - inputs: [ - { - name: 'from', - type: 'address', - internalType: 'address', - }, - { - name: 'to', - type: 'address', - internalType: 'address', - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, -] as const; - -export type EulerDtokenContract = typeof eulerDtokenContractAbi; -export type EulerDtokenContractContract = GetContractReturnType; - -export class EulerDtokenContract__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: eulerDtokenContractAbi, publicClient: client }); - } -} diff --git a/src/apps/euler/contracts/viem/EulerEtokenContract.ts b/src/apps/euler/contracts/viem/EulerEtokenContract.ts deleted file mode 100644 index 3cce494d3..000000000 --- a/src/apps/euler/contracts/viem/EulerEtokenContract.ts +++ /dev/null @@ -1,1362 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const eulerEtokenContractAbi = [ - { - stateMutability: 'nonpayable', - inputs: [ - { - internalType: 'bytes32', - type: 'bytes32', - name: 'moduleGitCommit_', - }, - ], - type: 'constructor', - }, - { - name: 'Approval', - anonymous: false, - type: 'event', - inputs: [ - { - name: 'owner', - internalType: 'address', - indexed: true, - type: 'address', - }, - { - name: 'spender', - internalType: 'address', - indexed: true, - type: 'address', - }, - { - type: 'uint256', - indexed: false, - internalType: 'uint256', - name: 'value', - }, - ], - }, - { - anonymous: false, - name: 'AssetStatus', - inputs: [ - { - type: 'address', - indexed: true, - internalType: 'address', - name: 'underlying', - }, - { - internalType: 'uint256', - indexed: false, - type: 'uint256', - name: 'totalBalances', - }, - { - internalType: 'uint256', - indexed: false, - type: 'uint256', - name: 'totalBorrows', - }, - { - indexed: false, - internalType: 'uint96', - type: 'uint96', - name: 'reserveBalance', - }, - { - type: 'uint256', - internalType: 'uint256', - indexed: false, - name: 'poolSize', - }, - { - name: 'interestAccumulator', - type: 'uint256', - internalType: 'uint256', - indexed: false, - }, - { - indexed: false, - internalType: 'int96', - type: 'int96', - name: 'interestRate', - }, - { - name: 'timestamp', - type: 'uint256', - internalType: 'uint256', - indexed: false, - }, - ], - type: 'event', - }, - { - name: 'Borrow', - anonymous: false, - type: 'event', - inputs: [ - { - name: 'underlying', - type: 'address', - indexed: true, - internalType: 'address', - }, - { - type: 'address', - indexed: true, - internalType: 'address', - name: 'account', - }, - { - name: 'amount', - indexed: false, - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - type: 'event', - inputs: [ - { - name: 'account', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'delegate', - }, - ], - name: 'DelegateAverageLiquidity', - anonymous: false, - }, - { - anonymous: false, - name: 'Deposit', - type: 'event', - inputs: [ - { - name: 'underlying', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - indexed: true, - internalType: 'address', - type: 'address', - name: 'account', - }, - { - type: 'uint256', - indexed: false, - internalType: 'uint256', - name: 'amount', - }, - ], - }, - { - type: 'event', - inputs: [ - { - name: 'underlying', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'account', - }, - ], - name: 'EnterMarket', - anonymous: false, - }, - { - type: 'event', - inputs: [ - { - name: 'underlying', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - indexed: true, - internalType: 'address', - type: 'address', - name: 'account', - }, - ], - name: 'ExitMarket', - anonymous: false, - }, - { - name: 'Genesis', - anonymous: false, - inputs: [], - type: 'event', - }, - { - name: 'GovConvertReserves', - anonymous: false, - type: 'event', - inputs: [ - { - name: 'underlying', - type: 'address', - indexed: true, - internalType: 'address', - }, - { - name: 'recipient', - internalType: 'address', - indexed: true, - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - type: 'uint256', - name: 'amount', - }, - ], - }, - { - inputs: [ - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'underlying', - }, - { - indexed: false, - internalType: 'struct Storage.AssetConfig', - type: 'tuple', - name: 'newConfig', - components: [ - { - name: 'eTokenAddress', - type: 'address', - internalType: 'address', - }, - { - name: 'borrowIsolated', - internalType: 'bool', - type: 'bool', - }, - { - internalType: 'uint32', - type: 'uint32', - name: 'collateralFactor', - }, - { - internalType: 'uint32', - type: 'uint32', - name: 'borrowFactor', - }, - { - internalType: 'uint24', - type: 'uint24', - name: 'twapWindow', - }, - ], - }, - ], - type: 'event', - name: 'GovSetAssetConfig', - anonymous: false, - }, - { - name: 'GovSetIRM', - anonymous: false, - inputs: [ - { - name: 'underlying', - indexed: true, - internalType: 'address', - type: 'address', - }, - { - type: 'uint256', - internalType: 'uint256', - indexed: false, - name: 'interestRateModel', - }, - { - name: 'resetParams', - type: 'bytes', - indexed: false, - internalType: 'bytes', - }, - ], - type: 'event', - }, - { - inputs: [ - { - name: 'underlying', - type: 'address', - indexed: true, - internalType: 'address', - }, - { - indexed: false, - internalType: 'uint16', - type: 'uint16', - name: 'newPricingType', - }, - { - name: 'newPricingParameter', - type: 'uint32', - indexed: false, - internalType: 'uint32', - }, - ], - type: 'event', - name: 'GovSetPricingConfig', - anonymous: false, - }, - { - anonymous: false, - name: 'GovSetReserveFee', - inputs: [ - { - indexed: true, - internalType: 'address', - type: 'address', - name: 'underlying', - }, - { - indexed: false, - internalType: 'uint32', - type: 'uint32', - name: 'newReserveFee', - }, - ], - type: 'event', - }, - { - anonymous: false, - name: 'InstallerInstallModule', - inputs: [ - { - name: 'moduleId', - type: 'uint256', - indexed: true, - internalType: 'uint256', - }, - { - internalType: 'address', - indexed: true, - type: 'address', - name: 'moduleImpl', - }, - { - internalType: 'bytes32', - indexed: false, - type: 'bytes32', - name: 'moduleGitCommit', - }, - ], - type: 'event', - }, - { - inputs: [ - { - type: 'address', - indexed: true, - internalType: 'address', - name: 'newGovernorAdmin', - }, - ], - type: 'event', - name: 'InstallerSetGovernorAdmin', - anonymous: false, - }, - { - name: 'InstallerSetUpgradeAdmin', - anonymous: false, - type: 'event', - inputs: [ - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'newUpgradeAdmin', - }, - ], - }, - { - inputs: [ - { - name: 'liquidator', - type: 'address', - indexed: true, - internalType: 'address', - }, - { - type: 'address', - indexed: true, - internalType: 'address', - name: 'violator', - }, - { - indexed: true, - internalType: 'address', - type: 'address', - name: 'underlying', - }, - { - name: 'collateral', - internalType: 'address', - indexed: false, - type: 'address', - }, - { - type: 'uint256', - indexed: false, - internalType: 'uint256', - name: 'repay', - }, - { - type: 'uint256', - indexed: false, - internalType: 'uint256', - name: 'yield', - }, - { - name: 'healthScore', - type: 'uint256', - indexed: false, - internalType: 'uint256', - }, - { - name: 'baseDiscount', - indexed: false, - internalType: 'uint256', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - type: 'uint256', - name: 'discount', - }, - ], - type: 'event', - anonymous: false, - name: 'Liquidation', - }, - { - type: 'event', - inputs: [ - { - indexed: true, - internalType: 'address', - type: 'address', - name: 'underlying', - }, - { - name: 'eToken', - indexed: true, - internalType: 'address', - type: 'address', - }, - { - name: 'dToken', - internalType: 'address', - indexed: true, - type: 'address', - }, - ], - anonymous: false, - name: 'MarketActivated', - }, - { - type: 'event', - inputs: [ - { - internalType: 'address', - indexed: true, - type: 'address', - name: 'underlying', - }, - { - name: 'pToken', - type: 'address', - indexed: true, - internalType: 'address', - }, - ], - anonymous: false, - name: 'PTokenActivated', - }, - { - inputs: [ - { - name: 'underlying', - internalType: 'address', - indexed: true, - type: 'address', - }, - { - name: 'account', - type: 'address', - indexed: true, - internalType: 'address', - }, - { - type: 'uint256', - indexed: false, - internalType: 'uint256', - name: 'amount', - }, - ], - type: 'event', - name: 'PTokenUnWrap', - anonymous: false, - }, - { - anonymous: false, - name: 'PTokenWrap', - inputs: [ - { - name: 'underlying', - type: 'address', - indexed: true, - internalType: 'address', - }, - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'account', - }, - { - type: 'uint256', - internalType: 'uint256', - indexed: false, - name: 'amount', - }, - ], - type: 'event', - }, - { - type: 'event', - inputs: [ - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'proxy', - }, - { - name: 'moduleId', - internalType: 'uint256', - indexed: false, - type: 'uint256', - }, - ], - name: 'ProxyCreated', - anonymous: false, - }, - { - inputs: [ - { - internalType: 'address', - indexed: true, - type: 'address', - name: 'underlying', - }, - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'account', - }, - { - indexed: false, - internalType: 'uint256', - type: 'uint256', - name: 'amount', - }, - ], - type: 'event', - anonymous: false, - name: 'Repay', - }, - { - inputs: [ - { - indexed: true, - internalType: 'address', - type: 'address', - name: 'account', - }, - { - indexed: false, - internalType: 'uint256', - type: 'uint256', - name: 'amount', - }, - ], - type: 'event', - name: 'RequestBorrow', - anonymous: false, - }, - { - inputs: [ - { - type: 'address', - indexed: true, - internalType: 'address', - name: 'account', - }, - { - type: 'uint256', - indexed: false, - internalType: 'uint256', - name: 'amount', - }, - ], - type: 'event', - name: 'RequestBurn', - anonymous: false, - }, - { - type: 'event', - inputs: [ - { - internalType: 'address', - indexed: true, - type: 'address', - name: 'account', - }, - { - type: 'uint256', - indexed: false, - internalType: 'uint256', - name: 'amount', - }, - ], - anonymous: false, - name: 'RequestDeposit', - }, - { - type: 'event', - inputs: [ - { - name: 'liquidator', - type: 'address', - indexed: true, - internalType: 'address', - }, - { - name: 'violator', - internalType: 'address', - indexed: true, - type: 'address', - }, - { - name: 'underlying', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - internalType: 'address', - indexed: false, - type: 'address', - name: 'collateral', - }, - { - indexed: false, - internalType: 'uint256', - type: 'uint256', - name: 'repay', - }, - { - type: 'uint256', - indexed: false, - internalType: 'uint256', - name: 'minYield', - }, - ], - name: 'RequestLiquidate', - anonymous: false, - }, - { - name: 'RequestMint', - anonymous: false, - type: 'event', - inputs: [ - { - name: 'account', - internalType: 'address', - indexed: true, - type: 'address', - }, - { - name: 'amount', - type: 'uint256', - indexed: false, - internalType: 'uint256', - }, - ], - }, - { - inputs: [ - { - name: 'account', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - name: 'amount', - type: 'uint256', - indexed: false, - internalType: 'uint256', - }, - ], - type: 'event', - anonymous: false, - name: 'RequestRepay', - }, - { - inputs: [ - { - name: 'accountIn', - internalType: 'address', - indexed: true, - type: 'address', - }, - { - internalType: 'address', - indexed: true, - type: 'address', - name: 'accountOut', - }, - { - name: 'underlyingIn', - internalType: 'address', - indexed: true, - type: 'address', - }, - { - name: 'underlyingOut', - indexed: false, - internalType: 'address', - type: 'address', - }, - { - internalType: 'uint256', - indexed: false, - type: 'uint256', - name: 'amount', - }, - { - type: 'uint256', - internalType: 'uint256', - indexed: false, - name: 'swapType', - }, - ], - type: 'event', - name: 'RequestSwap', - anonymous: false, - }, - { - type: 'event', - inputs: [ - { - name: 'from', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - name: 'to', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - type: 'uint256', - indexed: false, - internalType: 'uint256', - name: 'amount', - }, - ], - name: 'RequestTransferDToken', - anonymous: false, - }, - { - inputs: [ - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'from', - }, - { - name: 'to', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - name: 'amount', - internalType: 'uint256', - indexed: false, - type: 'uint256', - }, - ], - type: 'event', - name: 'RequestTransferEToken', - anonymous: false, - }, - { - anonymous: false, - name: 'RequestWithdraw', - inputs: [ - { - type: 'address', - indexed: true, - internalType: 'address', - name: 'account', - }, - { - name: 'amount', - type: 'uint256', - indexed: false, - internalType: 'uint256', - }, - ], - type: 'event', - }, - { - name: 'TrackAverageLiquidity', - anonymous: false, - type: 'event', - inputs: [ - { - name: 'account', - internalType: 'address', - indexed: true, - type: 'address', - }, - ], - }, - { - anonymous: false, - name: 'Transfer', - type: 'event', - inputs: [ - { - indexed: true, - internalType: 'address', - type: 'address', - name: 'from', - }, - { - name: 'to', - indexed: true, - internalType: 'address', - type: 'address', - }, - { - name: 'value', - type: 'uint256', - internalType: 'uint256', - indexed: false, - }, - ], - }, - { - name: 'UnTrackAverageLiquidity', - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - type: 'address', - name: 'account', - }, - ], - type: 'event', - }, - { - anonymous: false, - name: 'Withdraw', - type: 'event', - inputs: [ - { - indexed: true, - internalType: 'address', - type: 'address', - name: 'underlying', - }, - { - type: 'address', - internalType: 'address', - indexed: true, - name: 'account', - }, - { - name: 'amount', - indexed: false, - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - type: 'function', - inputs: [ - { - name: 'holder', - type: 'address', - internalType: 'address', - }, - { - name: 'spender', - internalType: 'address', - type: 'address', - }, - ], - outputs: [ - { - type: 'uint256', - internalType: 'uint256', - name: '', - }, - ], - stateMutability: 'view', - name: 'allowance', - }, - { - stateMutability: 'nonpayable', - name: 'approve', - type: 'function', - inputs: [ - { - internalType: 'address', - type: 'address', - name: 'spender', - }, - { - type: 'uint256', - internalType: 'uint256', - name: 'amount', - }, - ], - outputs: [ - { - name: '', - type: 'bool', - internalType: 'bool', - }, - ], - }, - { - outputs: [ - { - internalType: 'bool', - type: 'bool', - name: '', - }, - ], - inputs: [ - { - name: 'subAccountId', - internalType: 'uint256', - type: 'uint256', - }, - { - internalType: 'address', - type: 'address', - name: 'spender', - }, - { - type: 'uint256', - internalType: 'uint256', - name: 'amount', - }, - ], - type: 'function', - name: 'approveSubAccount', - stateMutability: 'nonpayable', - }, - { - type: 'function', - inputs: [ - { - name: 'account', - type: 'address', - internalType: 'address', - }, - ], - outputs: [ - { - name: '', - type: 'uint256', - internalType: 'uint256', - }, - ], - stateMutability: 'view', - name: 'balanceOf', - }, - { - name: 'balanceOfUnderlying', - stateMutability: 'view', - outputs: [ - { - internalType: 'uint256', - type: 'uint256', - name: '', - }, - ], - inputs: [ - { - name: 'account', - internalType: 'address', - type: 'address', - }, - ], - type: 'function', - }, - { - stateMutability: 'nonpayable', - name: 'burn', - type: 'function', - outputs: [], - inputs: [ - { - name: 'subAccountId', - internalType: 'uint256', - type: 'uint256', - }, - { - type: 'uint256', - internalType: 'uint256', - name: 'amount', - }, - ], - }, - { - name: 'convertBalanceToUnderlying', - stateMutability: 'view', - inputs: [ - { - name: 'balance', - internalType: 'uint256', - type: 'uint256', - }, - ], - outputs: [ - { - internalType: 'uint256', - type: 'uint256', - name: '', - }, - ], - type: 'function', - }, - { - stateMutability: 'view', - name: 'convertUnderlyingToBalance', - type: 'function', - inputs: [ - { - name: 'underlyingAmount', - type: 'uint256', - internalType: 'uint256', - }, - ], - outputs: [ - { - name: '', - internalType: 'uint256', - type: 'uint256', - }, - ], - }, - { - inputs: [], - outputs: [ - { - name: '', - internalType: 'uint8', - type: 'uint8', - }, - ], - type: 'function', - name: 'decimals', - stateMutability: 'pure', - }, - { - type: 'function', - inputs: [ - { - name: 'subAccountId', - type: 'uint256', - internalType: 'uint256', - }, - { - internalType: 'uint256', - type: 'uint256', - name: 'amount', - }, - ], - outputs: [], - stateMutability: 'nonpayable', - name: 'deposit', - }, - { - name: 'mint', - stateMutability: 'nonpayable', - inputs: [ - { - type: 'uint256', - internalType: 'uint256', - name: 'subAccountId', - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - }, - ], - outputs: [], - type: 'function', - }, - { - stateMutability: 'view', - name: 'moduleGitCommit', - type: 'function', - inputs: [], - outputs: [ - { - internalType: 'bytes32', - type: 'bytes32', - name: '', - }, - ], - }, - { - stateMutability: 'view', - name: 'moduleId', - type: 'function', - outputs: [ - { - type: 'uint256', - internalType: 'uint256', - name: '', - }, - ], - inputs: [], - }, - { - inputs: [], - outputs: [ - { - name: '', - type: 'string', - internalType: 'string', - }, - ], - type: 'function', - name: 'name', - stateMutability: 'view', - }, - { - stateMutability: 'view', - name: 'reserveBalance', - type: 'function', - inputs: [], - outputs: [ - { - name: '', - type: 'uint256', - internalType: 'uint256', - }, - ], - }, - { - inputs: [], - outputs: [ - { - name: '', - internalType: 'uint256', - type: 'uint256', - }, - ], - type: 'function', - name: 'reserveBalanceUnderlying', - stateMutability: 'view', - }, - { - inputs: [], - outputs: [ - { - name: '', - type: 'string', - internalType: 'string', - }, - ], - type: 'function', - name: 'symbol', - stateMutability: 'view', - }, - { - inputs: [], - outputs: [ - { - type: 'uint256', - internalType: 'uint256', - name: '', - }, - ], - type: 'function', - name: 'totalSupply', - stateMutability: 'view', - }, - { - type: 'function', - outputs: [ - { - internalType: 'uint256', - type: 'uint256', - name: '', - }, - ], - inputs: [], - stateMutability: 'view', - name: 'totalSupplyUnderlying', - }, - { - name: 'touch', - stateMutability: 'nonpayable', - inputs: [], - outputs: [], - type: 'function', - }, - { - stateMutability: 'nonpayable', - name: 'transfer', - type: 'function', - outputs: [ - { - internalType: 'bool', - type: 'bool', - name: '', - }, - ], - inputs: [ - { - name: 'to', - internalType: 'address', - type: 'address', - }, - { - type: 'uint256', - internalType: 'uint256', - name: 'amount', - }, - ], - }, - { - type: 'function', - outputs: [ - { - name: '', - internalType: 'bool', - type: 'bool', - }, - ], - inputs: [ - { - name: 'from', - type: 'address', - internalType: 'address', - }, - { - name: 'to', - type: 'address', - internalType: 'address', - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - name: 'transferFrom', - }, - { - type: 'function', - inputs: [ - { - internalType: 'address', - type: 'address', - name: 'from', - }, - { - name: 'to', - internalType: 'address', - type: 'address', - }, - ], - outputs: [ - { - internalType: 'bool', - type: 'bool', - name: '', - }, - ], - stateMutability: 'nonpayable', - name: 'transferFromMax', - }, - { - stateMutability: 'nonpayable', - name: 'withdraw', - type: 'function', - inputs: [ - { - internalType: 'uint256', - type: 'uint256', - name: 'subAccountId', - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - }, - ], - outputs: [], - }, -] as const; - -export type EulerEtokenContract = typeof eulerEtokenContractAbi; -export type EulerEtokenContractContract = GetContractReturnType; - -export class EulerEtokenContract__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: eulerEtokenContractAbi, publicClient: client }); - } -} diff --git a/src/apps/euler/contracts/viem/EulerPtokenContract.ts b/src/apps/euler/contracts/viem/EulerPtokenContract.ts deleted file mode 100644 index 78a8e805f..000000000 --- a/src/apps/euler/contracts/viem/EulerPtokenContract.ts +++ /dev/null @@ -1,324 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const eulerPtokenContractAbi = [ - { - inputs: [ - { - name: 'euler_', - type: 'address', - internalType: 'address', - }, - { - name: 'underlying_', - type: 'address', - internalType: 'address', - }, - ], - type: 'constructor', - stateMutability: 'nonpayable', - }, - { - anonymous: false, - name: 'Approval', - inputs: [ - { - name: 'owner', - type: 'address', - internalType: 'address', - indexed: true, - }, - { - name: 'spender', - indexed: true, - internalType: 'address', - type: 'address', - }, - { - name: 'value', - internalType: 'uint256', - indexed: false, - type: 'uint256', - }, - ], - type: 'event', - }, - { - inputs: [ - { - name: 'from', - type: 'address', - indexed: true, - internalType: 'address', - }, - { - name: 'to', - indexed: true, - internalType: 'address', - type: 'address', - }, - { - name: 'value', - type: 'uint256', - indexed: false, - internalType: 'uint256', - }, - ], - type: 'event', - name: 'Transfer', - anonymous: false, - }, - { - name: 'allowance', - stateMutability: 'view', - outputs: [ - { - type: 'uint256', - internalType: 'uint256', - name: '', - }, - ], - inputs: [ - { - internalType: 'address', - type: 'address', - name: 'holder', - }, - { - internalType: 'address', - type: 'address', - name: 'spender', - }, - ], - type: 'function', - }, - { - stateMutability: 'nonpayable', - name: 'approve', - type: 'function', - inputs: [ - { - type: 'address', - internalType: 'address', - name: 'spender', - }, - { - internalType: 'uint256', - type: 'uint256', - name: 'amount', - }, - ], - outputs: [ - { - internalType: 'bool', - type: 'bool', - name: '', - }, - ], - }, - { - name: 'balanceOf', - stateMutability: 'view', - outputs: [ - { - internalType: 'uint256', - type: 'uint256', - name: '', - }, - ], - inputs: [ - { - name: 'who', - type: 'address', - internalType: 'address', - }, - ], - type: 'function', - }, - { - name: 'claimSurplus', - stateMutability: 'nonpayable', - inputs: [ - { - name: 'who', - type: 'address', - internalType: 'address', - }, - ], - outputs: [], - type: 'function', - }, - { - inputs: [], - outputs: [ - { - type: 'uint8', - internalType: 'uint8', - name: '', - }, - ], - type: 'function', - name: 'decimals', - stateMutability: 'view', - }, - { - name: 'forceUnwrap', - stateMutability: 'nonpayable', - inputs: [ - { - type: 'address', - internalType: 'address', - name: 'who', - }, - { - name: 'amount', - type: 'uint256', - internalType: 'uint256', - }, - ], - outputs: [], - type: 'function', - }, - { - name: 'name', - stateMutability: 'view', - inputs: [], - outputs: [ - { - name: '', - internalType: 'string', - type: 'string', - }, - ], - type: 'function', - }, - { - stateMutability: 'view', - name: 'symbol', - type: 'function', - inputs: [], - outputs: [ - { - name: '', - internalType: 'string', - type: 'string', - }, - ], - }, - { - stateMutability: 'view', - name: 'totalSupply', - type: 'function', - outputs: [ - { - internalType: 'uint256', - type: 'uint256', - name: '', - }, - ], - inputs: [], - }, - { - inputs: [ - { - name: 'recipient', - type: 'address', - internalType: 'address', - }, - { - name: 'amount', - type: 'uint256', - internalType: 'uint256', - }, - ], - outputs: [ - { - name: '', - internalType: 'bool', - type: 'bool', - }, - ], - type: 'function', - name: 'transfer', - stateMutability: 'nonpayable', - }, - { - inputs: [ - { - internalType: 'address', - type: 'address', - name: 'from', - }, - { - internalType: 'address', - type: 'address', - name: 'recipient', - }, - { - name: 'amount', - internalType: 'uint256', - type: 'uint256', - }, - ], - outputs: [ - { - internalType: 'bool', - type: 'bool', - name: '', - }, - ], - type: 'function', - name: 'transferFrom', - stateMutability: 'nonpayable', - }, - { - type: 'function', - outputs: [ - { - name: '', - internalType: 'address', - type: 'address', - }, - ], - inputs: [], - stateMutability: 'view', - name: 'underlying', - }, - { - outputs: [], - inputs: [ - { - internalType: 'uint256', - type: 'uint256', - name: 'amount', - }, - ], - type: 'function', - name: 'unwrap', - stateMutability: 'nonpayable', - }, - { - name: 'wrap', - stateMutability: 'nonpayable', - inputs: [ - { - type: 'uint256', - internalType: 'uint256', - name: 'amount', - }, - ], - outputs: [], - type: 'function', - }, -] as const; - -export type EulerPtokenContract = typeof eulerPtokenContractAbi; -export type EulerPtokenContractContract = GetContractReturnType; - -export class EulerPtokenContract__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: eulerPtokenContractAbi, publicClient: client }); - } -} diff --git a/src/apps/euler/contracts/viem/EulerStakingRewardsContract.ts b/src/apps/euler/contracts/viem/EulerStakingRewardsContract.ts deleted file mode 100644 index f4fa8243d..000000000 --- a/src/apps/euler/contracts/viem/EulerStakingRewardsContract.ts +++ /dev/null @@ -1,652 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const eulerStakingRewardsContractAbi = [ - { - inputs: [ - { - internalType: 'address', - name: '_owner', - type: 'address', - }, - { - internalType: 'address', - name: '_rewardsDistribution', - type: 'address', - }, - { - internalType: 'address', - name: '_rewardsToken', - type: 'address', - }, - { - internalType: 'address', - name: '_stakingToken', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'oldOwner', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnerChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnerNominated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'bool', - name: 'isPaused', - type: 'bool', - }, - ], - name: 'PauseChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'token', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Recovered', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'reward', - type: 'uint256', - }, - ], - name: 'RewardAdded', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'user', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'reward', - type: 'uint256', - }, - ], - name: 'RewardPaid', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'newDuration', - type: 'uint256', - }, - ], - name: 'RewardsDurationUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'user', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Staked', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'user', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Withdrawn', - type: 'event', - }, - { - inputs: [], - name: 'acceptOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'earned', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'subAccountId', - type: 'uint256', - }, - ], - name: 'exit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'exit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'getReward', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'getRewardForDuration', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'lastPauseTime', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'lastTimeRewardApplicable', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'lastUpdateTime', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_owner', - type: 'address', - }, - ], - name: 'nominateNewOwner', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'nominatedOwner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'reward', - type: 'uint256', - }, - ], - name: 'notifyRewardAmount', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'owner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'paused', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'periodFinish', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'tokenAddress', - type: 'address', - }, - { - internalType: 'uint256', - name: 'tokenAmount', - type: 'uint256', - }, - ], - name: 'recoverERC20', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'rewardPerToken', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'rewardPerTokenStored', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'rewardRate', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'rewards', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'rewardsDistribution', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'rewardsDuration', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'rewardsToken', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bool', - name: '_paused', - type: 'bool', - }, - ], - name: 'setPaused', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_rewardsDistribution', - type: 'address', - }, - ], - name: 'setRewardsDistribution', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_rewardsDuration', - type: 'uint256', - }, - ], - name: 'setRewardsDuration', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'subAccountId', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'stake', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'stake', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'stakingToken', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'userRewardPerTokenPaid', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'withdraw', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'subAccountId', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'withdraw', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type EulerStakingRewardsContract = typeof eulerStakingRewardsContractAbi; -export type EulerStakingRewardsContractContract = GetContractReturnType; - -export class EulerStakingRewardsContract__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: eulerStakingRewardsContractAbi, publicClient: client }); - } -} diff --git a/src/apps/euler/contracts/viem/index.ts b/src/apps/euler/contracts/viem/index.ts deleted file mode 100644 index 3fee9bf21..000000000 --- a/src/apps/euler/contracts/viem/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ - -export type { EulerDtokenContract } from './EulerDtokenContract'; -export type { EulerEtokenContract } from './EulerEtokenContract'; -export type { EulerPtokenContract } from './EulerPtokenContract'; -export type { EulerStakingRewardsContract } from './EulerStakingRewardsContract'; - -export { EulerDtokenContract__factory } from './EulerDtokenContract'; -export { EulerEtokenContract__factory } from './EulerEtokenContract'; -export { EulerPtokenContract__factory } from './EulerPtokenContract'; -export { EulerStakingRewardsContract__factory } from './EulerStakingRewardsContract'; diff --git a/src/apps/euler/ethereum/euler.d-token.token-fetcher.ts b/src/apps/euler/ethereum/euler.d-token.token-fetcher.ts deleted file mode 100644 index 39cbfd879..000000000 --- a/src/apps/euler/ethereum/euler.d-token.token-fetcher.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { EulerDTokenTokenFetcher } from '../common/euler.d-token.token-fetcher'; -import { EulerTokenType } from '../common/euler.token-definition-resolver'; - -@PositionTemplate() -export class EthereumEulerDTokenTokenFetcher extends EulerDTokenTokenFetcher { - groupLabel = 'Lending'; - tokenType = EulerTokenType.D_TOKEN; - isDebt = true; -} diff --git a/src/apps/euler/ethereum/euler.e-token.token-fetcher.ts b/src/apps/euler/ethereum/euler.e-token.token-fetcher.ts deleted file mode 100644 index 60bfe362e..000000000 --- a/src/apps/euler/ethereum/euler.e-token.token-fetcher.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { EulerETokenTokenFetcher } from '../common/euler.e-token.token-fetcher'; -import { EulerTokenType } from '../common/euler.token-definition-resolver'; - -@PositionTemplate() -export class EthereumEulerETokenTokenFetcher extends EulerETokenTokenFetcher { - groupLabel = 'Lending'; - tokenType = EulerTokenType.E_TOKEN; - isDebt = false; -} diff --git a/src/apps/euler/ethereum/euler.p-token.token-fetcher.ts b/src/apps/euler/ethereum/euler.p-token.token-fetcher.ts deleted file mode 100644 index 1c7fa3923..000000000 --- a/src/apps/euler/ethereum/euler.p-token.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { EulerPTokenTokenFetcher } from '../common/euler.p-token.token-fetcher'; -import { EulerTokenType } from '../common/euler.token-definition-resolver'; - -@PositionTemplate() -export class EthereumEulerPTokenTokenFetcher extends EulerPTokenTokenFetcher { - groupLabel = 'Lending'; - tokenType = EulerTokenType.P_TOKEN; -} diff --git a/src/apps/euler/ethereum/euler.position-presenter.ts b/src/apps/euler/ethereum/euler.position-presenter.ts deleted file mode 100644 index 3ae855dfa..000000000 --- a/src/apps/euler/ethereum/euler.position-presenter.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { PresenterTemplate } from '~app-toolkit/decorators/presenter-template.decorator'; -import { PresentationConfig } from '~app/app.interface'; -import { PositionPresenterTemplate } from '~position/template/position-presenter.template'; - -@PresenterTemplate() -export class EthereumEulerPositionPresenter extends PositionPresenterTemplate { - explorePresentationConfig?: PresentationConfig = { - tabs: [ - { - label: 'Lending', - viewType: 'split', - views: [ - { - viewType: 'list', - label: 'Supply', - groupIds: ['e-token'], - }, - { - viewType: 'list', - label: 'Borrow', - groupIds: ['d-token'], - }, - ], - }, - { viewType: 'list', label: 'Farms', groupIds: ['single-staking-farm'] }, - ], - }; -} diff --git a/src/apps/euler/ethereum/euler.single-staking-farm.contract-position-fetcher.ts b/src/apps/euler/ethereum/euler.single-staking-farm.contract-position-fetcher.ts deleted file mode 100644 index 5bb92e4fa..000000000 --- a/src/apps/euler/ethereum/euler.single-staking-farm.contract-position-fetcher.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { EulerApiStakingRegistry } from '~apps/euler/common/euler.api.staking-registry'; -import { EulerViemContractFactory } from '~apps/euler/contracts'; -import { GetDataPropsParams, GetTokenBalancesParams } from '~position/template/contract-position.template.types'; -import { - SingleStakingFarmDataProps, - SingleStakingFarmDefinition, - SingleStakingFarmTemplateContractPositionFetcher, -} from '~position/template/single-staking.template.contract-position-fetcher'; - -import { EulerStakingRewardsContract } from '../contracts/viem'; - -@PositionTemplate() -export class EthereumEulerSingleStakingFarmContractPositionFetcher extends SingleStakingFarmTemplateContractPositionFetcher { - groupLabel = 'Farms'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(EulerViemContractFactory) protected readonly contractFactory: EulerViemContractFactory, - @Inject(EulerApiStakingRegistry) protected readonly stakingCacheManager: EulerApiStakingRegistry, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.eulerStakingRewardsContract({ address, network: this.network }); - } - - async getFarmDefinitions(): Promise { - const multicall = this.appToolkit.getViemMulticall(this.network); - const markets = await this.stakingCacheManager.getStakingDefinitions({ network: this.network }); - - return await Promise.all( - markets.map(async market => { - const vaultContract = this.contractFactory.eulerStakingRewardsContract({ - address: market.vaultAddress.toLowerCase(), - network: this.network, - }); - const [stakedTokenAddress, rewardTokenAddress] = await Promise.all([ - multicall.wrap(vaultContract).read.stakingToken(), - multicall.wrap(vaultContract).read.rewardsToken(), - ]); - - return { - address: market.vaultAddress, - stakedTokenAddress, - rewardTokenAddresses: [rewardTokenAddress], - }; - }), - ); - } - - getRewardRates({ contract }: GetDataPropsParams) { - return contract.read.rewardRate(); - } - - async getIsActive({ - contract, - }: GetDataPropsParams< - EulerStakingRewardsContract, - SingleStakingFarmDataProps, - SingleStakingFarmDefinition - >): Promise { - return (await contract.read.periodFinish()) > Math.floor(Date.now() / 1000); - } - - getStakedTokenBalance({ - address, - contract, - }: GetTokenBalancesParams) { - return contract.read.balanceOf([address]); - } - - getRewardTokenBalances({ - address, - contract, - }: GetTokenBalancesParams) { - return contract.read.earned([address]); - } -} diff --git a/src/apps/euler/euler.module.ts b/src/apps/euler/euler.module.ts deleted file mode 100644 index 658c906a4..000000000 --- a/src/apps/euler/euler.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { AbstractApp } from '~app/app.dynamic-module'; -import { EulerApiStakingRegistry } from '~apps/euler/common/euler.api.staking-registry'; - -import { EulerTokenDefinitionsResolver } from './common/euler.token-definition-resolver'; -import { EulerViemContractFactory } from './contracts'; -import { EthereumEulerDTokenTokenFetcher } from './ethereum/euler.d-token.token-fetcher'; -import { EthereumEulerETokenTokenFetcher } from './ethereum/euler.e-token.token-fetcher'; -import { EthereumEulerPTokenTokenFetcher } from './ethereum/euler.p-token.token-fetcher'; -import { EthereumEulerPositionPresenter } from './ethereum/euler.position-presenter'; -import { EthereumEulerSingleStakingFarmContractPositionFetcher } from './ethereum/euler.single-staking-farm.contract-position-fetcher'; - -@Module({ - providers: [ - EthereumEulerDTokenTokenFetcher, - EthereumEulerETokenTokenFetcher, - EthereumEulerPTokenTokenFetcher, - EthereumEulerPositionPresenter, - EthereumEulerSingleStakingFarmContractPositionFetcher, - EulerViemContractFactory, - EulerTokenDefinitionsResolver, - EulerApiStakingRegistry, - ], -}) -export class EulerAppModule extends AbstractApp() {} diff --git a/src/apps/furucombo/polygon/furucombo.fund.token-fetcher.ts b/src/apps/furucombo/polygon/furucombo.fund.token-fetcher.ts index fd08995ae..d8d860025 100644 --- a/src/apps/furucombo/polygon/furucombo.fund.token-fetcher.ts +++ b/src/apps/furucombo/polygon/furucombo.fund.token-fetcher.ts @@ -25,15 +25,9 @@ interface FurucomboFund { name: string; token: { address: string; - symbol: string; - decimals: number; - name: string; }; stakingToken: { address: string; - symbol: string; - decimals: number; - name: string; }; liquidity: string; apy: string; diff --git a/src/apps/gains-network/common/gains-network.g-token.token-fetcher.ts b/src/apps/gains-network/common/gains-network.g-token.token-fetcher.ts deleted file mode 100644 index cf1ba6f28..000000000 --- a/src/apps/gains-network/common/gains-network.g-token.token-fetcher.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetPricePerShareParams, GetUnderlyingTokensParams } from '~position/template/app-token.template.types'; - -import { GainsNetworkViemContractFactory } from '../contracts'; -import { GainsNetworkGToken } from '../contracts/viem'; - -export abstract class GainsNetworkGTokenTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'gTokens'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(GainsNetworkViemContractFactory) protected readonly contractFactory: GainsNetworkViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.gainsNetworkGToken({ network: this.network, address }); - } - - async getAddresses() { - return ['0xd85e038593d7a098614721eae955ec2022b9b91b']; - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.asset(), network: this.network }]; - } - - async getPricePerShare({ contract, appToken }: GetPricePerShareParams) { - const pricePerShareRaw = await contract.read.shareToAssetsPrice(); - const pricePerShare = Number(pricePerShareRaw) / 10 ** appToken.decimals; - - return [pricePerShare]; - } -} diff --git a/src/apps/gains-network/contracts/abis/gains-network-g-token.json b/src/apps/gains-network/contracts/abis/gains-network-g-token.json index 6106c5337..5ce3e2369 100644 --- a/src/apps/gains-network/contracts/abis/gains-network-g-token.json +++ b/src/apps/gains-network/contracts/abis/gains-network-g-token.json @@ -2,12 +2,42 @@ { "anonymous": false, "inputs": [ - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, - { "indexed": true, "internalType": "uint256", "name": "newEpoch", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "prevPositiveOpenPnl", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "newPositiveOpenPnl", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "newEpochPositiveOpenPnl", "type": "uint256" }, - { "indexed": false, "internalType": "int256", "name": "newAccPnlPerTokenUsed", "type": "int256" } + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "newEpoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "prevPositiveOpenPnl", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newPositiveOpenPnl", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newEpochPositiveOpenPnl", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "int256", + "name": "newAccPnlPerTokenUsed", + "type": "int256" + } ], "name": "AccPnlPerTokenUsedUpdated", "type": "event" @@ -15,8 +45,18 @@ { "anonymous": false, "inputs": [ - { "indexed": false, "internalType": "string", "name": "name", "type": "string" }, - { "indexed": false, "internalType": "address", "name": "newValue", "type": "address" } + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "indexed": false, + "internalType": "address", + "name": "newValue", + "type": "address" + } ], "name": "AddressParamUpdated", "type": "event" @@ -24,9 +64,24 @@ { "anonymous": false, "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } ], "name": "Approval", "type": "event" @@ -34,10 +89,30 @@ { "anonymous": false, "inputs": [ - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "assets", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "assetsLessDeplete", "type": "uint256" } + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "assets", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "assetsLessDeplete", + "type": "uint256" + } ], "name": "AssetsReceived", "type": "event" @@ -45,26 +120,68 @@ { "anonymous": false, "inputs": [ - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "receiver", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "assets", "type": "uint256" } + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } ], "name": "AssetsSent", "type": "event" }, { "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256", "name": "newValue", "type": "uint256" }], + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newValue", + "type": "uint256" + } + ], "name": "CurrentMaxSupplyUpdated", "type": "event" }, - { "anonymous": false, "inputs": [], "name": "DailyAccPnlDeltaReset", "type": "event" }, + { + "anonymous": false, + "inputs": [], + "name": "DailyAccPnlDeltaReset", + "type": "event" + }, { "anonymous": false, "inputs": [ - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "assets", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "amountGns", "type": "uint256" } + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "assets", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountGns", + "type": "uint256" + } ], "name": "Depleted", "type": "event" @@ -72,10 +189,30 @@ { "anonymous": false, "inputs": [ - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "assets", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "shares", "type": "uint256" } + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "assets", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } ], "name": "Deposit", "type": "event" @@ -83,17 +220,56 @@ { "anonymous": false, "inputs": [ - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "depositId", "type": "uint256" }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, { "components": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "uint256", "name": "shares", "type": "uint256" }, - { "internalType": "uint256", "name": "assetsDeposited", "type": "uint256" }, - { "internalType": "uint256", "name": "assetsDiscount", "type": "uint256" }, - { "internalType": "uint256", "name": "atTimestamp", "type": "uint256" }, - { "internalType": "uint256", "name": "lockDuration", "type": "uint256" } + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetsDeposited", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetsDiscount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "atTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lockDuration", + "type": "uint256" + } ], "indexed": false, "internalType": "struct IGToken.LockedDeposit", @@ -107,18 +283,62 @@ { "anonymous": false, "inputs": [ - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "receiver", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "depositId", "type": "uint256" }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, { "components": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "uint256", "name": "shares", "type": "uint256" }, - { "internalType": "uint256", "name": "assetsDeposited", "type": "uint256" }, - { "internalType": "uint256", "name": "assetsDiscount", "type": "uint256" }, - { "internalType": "uint256", "name": "atTimestamp", "type": "uint256" }, - { "internalType": "uint256", "name": "lockDuration", "type": "uint256" } + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetsDeposited", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetsDiscount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "atTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lockDuration", + "type": "uint256" + } ], "indexed": false, "internalType": "struct IGToken.LockedDeposit", @@ -134,8 +354,16 @@ "inputs": [ { "components": [ - { "internalType": "address", "name": "addr", "type": "address" }, - { "internalType": "bytes", "name": "signature", "type": "bytes" } + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } ], "indexed": false, "internalType": "struct GToken.GnsPriceProvider", @@ -148,25 +376,57 @@ }, { "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint8", "name": "version", "type": "uint8" }], + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ - { "indexed": false, "internalType": "string", "name": "name", "type": "string" }, - { "indexed": false, "internalType": "uint256", "name": "newValue", "type": "uint256" } + { + "indexed": false, + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newValue", + "type": "uint256" + } ], "name": "NumberParamUpdated", "type": "event" }, - { "anonymous": false, "inputs": [], "name": "OpenTradesPnlFeedCallFailed", "type": "event" }, + { + "anonymous": false, + "inputs": [], + "name": "OpenTradesPnlFeedCallFailed", + "type": "event" + }, { "anonymous": false, "inputs": [ - { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } ], "name": "OwnershipTransferred", "type": "event" @@ -174,9 +434,24 @@ { "anonymous": false, "inputs": [ - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "assets", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "amountGns", "type": "uint256" } + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "assets", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amountGns", + "type": "uint256" + } ], "name": "Refilled", "type": "event" @@ -184,24 +459,56 @@ { "anonymous": false, "inputs": [ - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "assets", "type": "uint256" } + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } ], "name": "RewardDistributed", "type": "event" }, { "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256", "name": "newValue", "type": "uint256" }], + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newValue", + "type": "uint256" + } + ], "name": "ShareToAssetsPriceUpdated", "type": "event" }, { "anonymous": false, "inputs": [ - { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } ], "name": "Transfer", "type": "event" @@ -209,11 +516,36 @@ { "anonymous": false, "inputs": [ - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "receiver", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "assets", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "shares", "type": "uint256" } + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "assets", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } ], "name": "Withdraw", "type": "event" @@ -221,29 +553,86 @@ { "anonymous": false, "inputs": [ - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "shares", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "currEpoch", "type": "uint256" }, - { "indexed": true, "internalType": "uint256", "name": "unlockEpoch", "type": "uint256" } + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "currEpoch", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "unlockEpoch", + "type": "uint256" + } ], "name": "WithdrawCanceled", "type": "event" }, { "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256[2]", "name": "newValue", "type": "uint256[2]" }], + "inputs": [ + { + "indexed": false, + "internalType": "uint256[2]", + "name": "newValue", + "type": "uint256[2]" + } + ], "name": "WithdrawLockThresholdsPUpdated", "type": "event" }, { "anonymous": false, "inputs": [ - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "shares", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "currEpoch", "type": "uint256" }, - { "indexed": true, "internalType": "uint256", "name": "unlockEpoch", "type": "uint256" } + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "currEpoch", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "unlockEpoch", + "type": "uint256" + } ], "name": "WithdrawRequested", "type": "event" @@ -251,91 +640,191 @@ { "inputs": [], "name": "MIN_LOCK_DURATION", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "accPnlPerToken", - "outputs": [{ "internalType": "int256", "name": "", "type": "int256" }], + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "accPnlPerTokenUsed", - "outputs": [{ "internalType": "int256", "name": "", "type": "int256" }], + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "accRewardsPerToken", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "admin", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" } + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } ], "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } ], "name": "approve", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "asset", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "assetsToDeplete", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "availableAssets", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [ - { "internalType": "uint256", "name": "shares", "type": "uint256" }, - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "uint256", "name": "unlockEpoch", "type": "uint256" } + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "unlockEpoch", + "type": "uint256" + } ], "name": "cancelWithdrawRequest", "outputs": [], @@ -345,92 +834,190 @@ { "inputs": [], "name": "collateralizationP", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "shares", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], "name": "convertToAssets", - "outputs": [{ "internalType": "uint256", "name": "assets", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "assets", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], "name": "convertToShares", - "outputs": [{ "internalType": "uint256", "name": "shares", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "currentBalanceDai", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "currentEpoch", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "currentEpochPositiveOpenPnl", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "currentEpochStart", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "currentMaxSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "dailyAccPnlDelta", - "outputs": [{ "internalType": "int256", "name": "", "type": "int256" }], + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "dailyMintedGns", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "subtractedValue", "type": "uint256" } + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } ], "name": "decreaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "assets", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], "name": "deplete", "outputs": [], "stateMutability": "nonpayable", @@ -438,44 +1025,112 @@ }, { "inputs": [ - { "internalType": "uint256", "name": "assets", "type": "uint256" }, - { "internalType": "address", "name": "receiver", "type": "address" } + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } ], "name": "deposit", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { "internalType": "uint256", "name": "assets", "type": "uint256" }, - { "internalType": "uint256", "name": "lockDuration", "type": "uint256" }, - { "internalType": "address", "name": "receiver", "type": "address" } + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lockDuration", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } ], "name": "depositWithDiscountAndLock", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "assets", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], "name": "distributeReward", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "depositId", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + } + ], "name": "getLockedDeposit", "outputs": [ { "components": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "uint256", "name": "shares", "type": "uint256" }, - { "internalType": "uint256", "name": "assetsDeposited", "type": "uint256" }, - { "internalType": "uint256", "name": "assetsDiscount", "type": "uint256" }, - { "internalType": "uint256", "name": "atTimestamp", "type": "uint256" }, - { "internalType": "uint256", "name": "lockDuration", "type": "uint256" } + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetsDeposited", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetsDiscount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "atTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lockDuration", + "type": "uint256" + } ], "internalType": "struct IGToken.LockedDeposit", "name": "", @@ -489,8 +1144,16 @@ "inputs": [], "name": "gnsPriceProvider", "outputs": [ - { "internalType": "address", "name": "addr", "type": "address" }, - { "internalType": "bytes", "name": "signature", "type": "bytes" } + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } ], "stateMutability": "view", "type": "function" @@ -498,45 +1161,119 @@ { "inputs": [], "name": "gnsToken", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "gnsTokenToAssetsPrice", - "outputs": [{ "internalType": "uint256", "name": "price", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "addedValue", "type": "uint256" } + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } ], "name": "increaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { "internalType": "string", "name": "_name", "type": "string" }, - { "internalType": "string", "name": "_symbol", "type": "string" }, + { + "internalType": "string", + "name": "_name", + "type": "string" + }, + { + "internalType": "string", + "name": "_symbol", + "type": "string" + }, { "components": [ - { "internalType": "address", "name": "asset", "type": "address" }, - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "manager", "type": "address" }, - { "internalType": "address", "name": "admin", "type": "address" }, - { "internalType": "address", "name": "gnsToken", "type": "address" }, - { "internalType": "address", "name": "lockedDepositNft", "type": "address" }, - { "internalType": "address", "name": "pnlHandler", "type": "address" }, - { "internalType": "address", "name": "openTradesPnlFeed", "type": "address" }, + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "manager", + "type": "address" + }, + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "gnsToken", + "type": "address" + }, + { + "internalType": "address", + "name": "lockedDepositNft", + "type": "address" + }, + { + "internalType": "address", + "name": "pnlHandler", + "type": "address" + }, + { + "internalType": "address", + "name": "openTradesPnlFeed", + "type": "address" + }, { "components": [ - { "internalType": "address", "name": "addr", "type": "address" }, - { "internalType": "bytes", "name": "signature", "type": "bytes" } + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } ], "internalType": "struct GToken.GnsPriceProvider", "name": "gnsPriceProvider", @@ -547,15 +1284,51 @@ "name": "_contractAddresses", "type": "tuple" }, - { "internalType": "uint256", "name": "_MIN_LOCK_DURATION", "type": "uint256" }, - { "internalType": "uint256", "name": "_maxAccOpenPnlDelta", "type": "uint256" }, - { "internalType": "uint256", "name": "_maxDailyAccPnlDelta", "type": "uint256" }, - { "internalType": "uint256[2]", "name": "_withdrawLockThresholdsP", "type": "uint256[2]" }, - { "internalType": "uint256", "name": "_maxSupplyIncreaseDailyP", "type": "uint256" }, - { "internalType": "uint256", "name": "_lossesBurnP", "type": "uint256" }, - { "internalType": "uint256", "name": "_maxGnsSupplyMintDailyP", "type": "uint256" }, - { "internalType": "uint256", "name": "_maxDiscountP", "type": "uint256" }, - { "internalType": "uint256", "name": "_maxDiscountThresholdP", "type": "uint256" } + { + "internalType": "uint256", + "name": "_MIN_LOCK_DURATION", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxAccOpenPnlDelta", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxDailyAccPnlDelta", + "type": "uint256" + }, + { + "internalType": "uint256[2]", + "name": "_withdrawLockThresholdsP", + "type": "uint256[2]" + }, + { + "internalType": "uint256", + "name": "_maxSupplyIncreaseDailyP", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_lossesBurnP", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxGnsSupplyMintDailyP", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxDiscountP", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_maxDiscountThresholdP", + "type": "uint256" + } ], "name": "initialize", "outputs": [], @@ -565,51 +1338,119 @@ { "inputs": [], "name": "lastDailyAccPnlDeltaReset", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "lastDailyMintedGnsReset", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "lastMaxSupplyUpdate", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [ - { "internalType": "uint256", "name": "collatP", "type": "uint256" }, - { "internalType": "uint256", "name": "lockDuration", "type": "uint256" } + { + "internalType": "uint256", + "name": "collatP", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lockDuration", + "type": "uint256" + } ], "name": "lockDiscountP", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "lockedDepositNft", - "outputs": [{ "internalType": "contract INft", "name": "", "type": "address" }], + "outputs": [ + { + "internalType": "contract INft", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "name": "lockedDeposits", "outputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "uint256", "name": "shares", "type": "uint256" }, - { "internalType": "uint256", "name": "assetsDeposited", "type": "uint256" }, - { "internalType": "uint256", "name": "assetsDiscount", "type": "uint256" }, - { "internalType": "uint256", "name": "atTimestamp", "type": "uint256" }, - { "internalType": "uint256", "name": "lockDuration", "type": "uint256" } + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetsDeposited", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "assetsDiscount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "atTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lockDuration", + "type": "uint256" + } ], "stateMutability": "view", "type": "function" @@ -617,21 +1458,41 @@ { "inputs": [], "name": "lockedDepositsCount", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "lossesBurnP", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [ - { "internalType": "uint256", "name": "shares", "type": "uint256" }, - { "internalType": "address", "name": "owner", "type": "address" } + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } ], "name": "makeWithdrawRequest", "outputs": [], @@ -641,168 +1502,376 @@ { "inputs": [], "name": "manager", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxAccOpenPnlDelta", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxAccPnlPerToken", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxDailyAccPnlDelta", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], "name": "maxDeposit", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxDiscountP", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxDiscountThresholdP", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxGnsSupplyMintDailyP", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], "name": "maxMint", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], "name": "maxRedeem", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxSupplyIncreaseDailyP", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], "name": "maxWithdraw", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [ - { "internalType": "uint256", "name": "shares", "type": "uint256" }, - { "internalType": "address", "name": "receiver", "type": "address" } + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } ], "name": "mint", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { "internalType": "uint256", "name": "shares", "type": "uint256" }, - { "internalType": "uint256", "name": "lockDuration", "type": "uint256" }, - { "internalType": "address", "name": "receiver", "type": "address" } + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lockDuration", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } ], "name": "mintWithDiscountAndLock", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "openTradesPnlFeed", - "outputs": [{ "internalType": "contract IOpenTradesPnlFeed", "name": "", "type": "address" }], + "outputs": [ + { + "internalType": "contract IOpenTradesPnlFeed", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "pnlHandler", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "assets", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], "name": "previewDeposit", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "shares", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], "name": "previewMint", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "shares", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], "name": "previewRedeem", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "assets", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], "name": "previewWithdraw", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [ - { "internalType": "uint256", "name": "assets", "type": "uint256" }, - { "internalType": "address", "name": "user", "type": "address" } + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + } ], "name": "receiveAssets", "outputs": [], @@ -811,27 +1880,65 @@ }, { "inputs": [ - { "internalType": "uint256", "name": "shares", "type": "uint256" }, - { "internalType": "address", "name": "receiver", "type": "address" }, - { "internalType": "address", "name": "owner", "type": "address" } + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } ], "name": "redeem", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "assets", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], "name": "refill", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ - { "internalType": "uint256", "name": "assets", "type": "uint256" }, - { "internalType": "address", "name": "receiver", "type": "address" } + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } ], "name": "sendAssets", "outputs": [], @@ -841,131 +1948,265 @@ { "inputs": [], "name": "shareToAssetsPrice", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalAssets", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalClosedPnl", - "outputs": [{ "internalType": "int256", "name": "", "type": "int256" }], + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalDepleted", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalDepletedGns", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalDeposited", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalDiscounts", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalLiability", - "outputs": [{ "internalType": "int256", "name": "", "type": "int256" }], + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalLockedDiscounts", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalRefilled", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalRefilledGns", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalRewards", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], "name": "totalSharesBeingWithdrawn", - "outputs": [{ "internalType": "uint256", "name": "shares", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [ - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } ], "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } ], "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", @@ -995,14 +2236,28 @@ { "inputs": [], "name": "tvl", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [ - { "internalType": "uint256", "name": "depositId", "type": "uint256" }, - { "internalType": "address", "name": "receiver", "type": "address" } + { + "internalType": "uint256", + "name": "depositId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } ], "name": "unlockDeposit", "outputs": [], @@ -1011,16 +2266,36 @@ }, { "inputs": [ - { "internalType": "uint256", "name": "prevPositiveOpenPnl", "type": "uint256" }, - { "internalType": "uint256", "name": "newPositiveOpenPnl", "type": "uint256" } + { + "internalType": "uint256", + "name": "prevPositiveOpenPnl", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newPositiveOpenPnl", + "type": "uint256" + } ], "name": "updateAccPnlPerTokenUsed", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ "internalType": "address", "name": "newValue", "type": "address" }], + "inputs": [ + { + "internalType": "address", + "name": "newValue", + "type": "address" + } + ], "name": "updateAdmin", "outputs": [], "stateMutability": "nonpayable", @@ -1030,8 +2305,16 @@ "inputs": [ { "components": [ - { "internalType": "address", "name": "addr", "type": "address" }, - { "internalType": "bytes", "name": "signature", "type": "bytes" } + { + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } ], "internalType": "struct GToken.GnsPriceProvider", "name": "newValue", @@ -1044,77 +2327,143 @@ "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "newValue", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "newValue", + "type": "uint256" + } + ], "name": "updateLossesBurnP", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ "internalType": "address", "name": "newValue", "type": "address" }], + "inputs": [ + { + "internalType": "address", + "name": "newValue", + "type": "address" + } + ], "name": "updateManager", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "newValue", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "newValue", + "type": "uint256" + } + ], "name": "updateMaxAccOpenPnlDelta", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "newValue", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "newValue", + "type": "uint256" + } + ], "name": "updateMaxDailyAccPnlDelta", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "newValue", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "newValue", + "type": "uint256" + } + ], "name": "updateMaxDiscountP", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "newValue", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "newValue", + "type": "uint256" + } + ], "name": "updateMaxDiscountThresholdP", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "newValue", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "newValue", + "type": "uint256" + } + ], "name": "updateMaxGnsSupplyMintDailyP", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "newValue", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "newValue", + "type": "uint256" + } + ], "name": "updateMaxSupplyIncreaseDailyP", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ "internalType": "address", "name": "newValue", "type": "address" }], + "inputs": [ + { + "internalType": "address", + "name": "newValue", + "type": "address" + } + ], "name": "updateOpenTradesPnlFeed", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ "internalType": "address", "name": "newValue", "type": "address" }], + "inputs": [ + { + "internalType": "address", + "name": "newValue", + "type": "address" + } + ], "name": "updatePnlHandler", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [{ "internalType": "uint256[2]", "name": "newValue", "type": "uint256[2]" }], + "inputs": [ + { + "internalType": "uint256[2]", + "name": "newValue", + "type": "uint256[2]" + } + ], "name": "updateWithdrawLockThresholdsP", "outputs": [], "stateMutability": "nonpayable", @@ -1122,36 +2471,86 @@ }, { "inputs": [ - { "internalType": "uint256", "name": "assets", "type": "uint256" }, - { "internalType": "address", "name": "receiver", "type": "address" }, - { "internalType": "address", "name": "owner", "type": "address" } + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } ], "name": "withdraw", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "withdrawEpochsTimelock", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { - "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "name": "withdrawLockThresholdsP", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" }, { "inputs": [ - { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "uint256", "name": "", "type": "uint256" } + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } ], "name": "withdrawRequests", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], "stateMutability": "view", "type": "function" } diff --git a/src/apps/gains-network/gains-network.module.ts b/src/apps/gains-network/gains-network.module.ts index 3f5e37a27..cc03041a8 100644 --- a/src/apps/gains-network/gains-network.module.ts +++ b/src/apps/gains-network/gains-network.module.ts @@ -6,7 +6,6 @@ import { ArbitrumGainsNetworkLockedContractPositionFetcher } from './arbitrum/ga import { ArbitrumGainsNetworkStakingV2ContractPositionFetcher } from './arbitrum/gains-network.staking-v2.contract-position-fetcher'; import { ArbitrumGainsNetworkStakingContractPositionFetcher } from './arbitrum/gains-network.staking.contract-position-fetcher'; import { GainsNetworkViemContractFactory } from './contracts'; -import { PolygonGainsNetworkGTokenTokenFetcher } from './polygon/gains-network.g-token.token-fetcher'; import { PolygonGainsNetworkLockedContractPositionFetcher } from './polygon/gains-network.locked.contract-position-fetcher'; import { PolygonGainsNetworkStakingV2ContractPositionFetcher } from './polygon/gains-network.staking-v2.contract-position-fetcher'; import { PolygonGainsNetworkStakingContractPositionFetcher } from './polygon/gains-network.staking.contract-position-fetcher'; @@ -20,7 +19,6 @@ import { PolygonGainsNetworkStakingContractPositionFetcher } from './polygon/gai ArbitrumGainsNetworkStakingV2ContractPositionFetcher, // Polygon PolygonGainsNetworkStakingContractPositionFetcher, - PolygonGainsNetworkGTokenTokenFetcher, PolygonGainsNetworkLockedContractPositionFetcher, PolygonGainsNetworkStakingV2ContractPositionFetcher, ], diff --git a/src/apps/gains-network/polygon/gains-network.g-token.token-fetcher.ts b/src/apps/gains-network/polygon/gains-network.g-token.token-fetcher.ts deleted file mode 100644 index 0d9974770..000000000 --- a/src/apps/gains-network/polygon/gains-network.g-token.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { GainsNetworkGTokenTokenFetcher } from '../common/gains-network.g-token.token-fetcher'; - -@PositionTemplate() -export class PolygonGainsNetworkGTokenTokenFetcher extends GainsNetworkGTokenTokenFetcher { - async getAddresses() { - return ['0x91993f2101cc758d0deb7279d41e880f7defe827']; - } -} diff --git a/src/apps/klima/contracts/abis/klima-distributor.json b/src/apps/klima/contracts/abis/klima-distributor.json deleted file mode 100644 index 14179eec1..000000000 --- a/src/apps/klima/contracts/abis/klima-distributor.json +++ /dev/null @@ -1,139 +0,0 @@ -[ - { - "inputs": [ - { "internalType": "address", "name": "_treasury", "type": "address" }, - { "internalType": "address", "name": "_klima", "type": "address" }, - { "internalType": "uint256", "name": "_epochLength", "type": "uint256" }, - { "internalType": "uint256", "name": "_nextEpochBlock", "type": "uint256" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "inputs": [], - "name": "KLIMA", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_recipient", "type": "address" }, - { "internalType": "uint256", "name": "_rewardRate", "type": "uint256" } - ], - "name": "addRecipient", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "name": "adjustments", - "outputs": [ - { "internalType": "bool", "name": "add", "type": "bool" }, - { "internalType": "uint256", "name": "rate", "type": "uint256" }, - { "internalType": "uint256", "name": "target", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "distribute", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "epochLength", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "name": "info", - "outputs": [ - { "internalType": "uint256", "name": "rate", "type": "uint256" }, - { "internalType": "address", "name": "recipient", "type": "address" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "nextEpochBlock", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_rate", "type": "uint256" }], - "name": "nextRewardAt", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_recipient", "type": "address" }], - "name": "nextRewardFor", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "policy", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { "inputs": [], "name": "pullPolicy", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [{ "internalType": "address", "name": "newPolicy_", "type": "address" }], - "name": "pushPolicy", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "_index", "type": "uint256" }, - { "internalType": "address", "name": "_recipient", "type": "address" } - ], - "name": "removeRecipient", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { "inputs": [], "name": "renouncePolicy", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { "internalType": "uint256", "name": "_index", "type": "uint256" }, - { "internalType": "bool", "name": "_add", "type": "bool" }, - { "internalType": "uint256", "name": "_rate", "type": "uint256" }, - { "internalType": "uint256", "name": "_target", "type": "uint256" } - ], - "name": "setAdjustment", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "treasury", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - } -] diff --git a/src/apps/klima/contracts/abis/klima-s-klima.json b/src/apps/klima/contracts/abis/klima-s-klima.json deleted file mode 100644 index 4ecbf5cd0..000000000 --- a/src/apps/klima/contracts/abis/klima-s-klima.json +++ /dev/null @@ -1,303 +0,0 @@ -[ - { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "rebase", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "index", "type": "uint256" } - ], - "name": "LogRebase", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "stakingContract", "type": "address" }], - "name": "LogStakingContractUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "timestamp", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "totalSupply", "type": "uint256" } - ], - "name": "LogSupply", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } - ], - "name": "OwnershipPulled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } - ], - "name": "OwnershipPushed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [], - "name": "DOMAIN_SEPARATOR", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INDEX", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PERMIT_TYPEHASH", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner_", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "gons", "type": "uint256" }], - "name": "balanceForGons", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "who", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "circulatingSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "subtractedValue", "type": "uint256" } - ], - "name": "decreaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "gonsForBalance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "addedValue", "type": "uint256" } - ], - "name": "increaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "index", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "stakingContract_", "type": "address" }], - "name": "initialize", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "initializer", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "manager", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], - "name": "nonces", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" }, - { "internalType": "uint256", "name": "deadline", "type": "uint256" }, - { "internalType": "uint8", "name": "v", "type": "uint8" }, - { "internalType": "bytes32", "name": "r", "type": "bytes32" }, - { "internalType": "bytes32", "name": "s", "type": "bytes32" } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { "inputs": [], "name": "pullManagement", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [{ "internalType": "address", "name": "newOwner_", "type": "address" }], - "name": "pushManagement", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "profit_", "type": "uint256" }, - { "internalType": "uint256", "name": "epoch_", "type": "uint256" } - ], - "name": "rebase", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "name": "rebases", - "outputs": [ - { "internalType": "uint256", "name": "epoch", "type": "uint256" }, - { "internalType": "uint256", "name": "rebase", "type": "uint256" }, - { "internalType": "uint256", "name": "totalStakedBefore", "type": "uint256" }, - { "internalType": "uint256", "name": "totalStakedAfter", "type": "uint256" }, - { "internalType": "uint256", "name": "amountRebased", "type": "uint256" }, - { "internalType": "uint256", "name": "index", "type": "uint256" }, - { "internalType": "uint256", "name": "blockNumberOccured", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function" - }, - { "inputs": [], "name": "renounceManagement", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [{ "internalType": "uint256", "name": "_INDEX", "type": "uint256" }], - "name": "setIndex", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "stakingContract", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/klima/contracts/abis/klima-ws-klima.json b/src/apps/klima/contracts/abis/klima-ws-klima.json deleted file mode 100644 index a88b16de6..000000000 --- a/src/apps/klima/contracts/abis/klima-ws-klima.json +++ /dev/null @@ -1,158 +0,0 @@ -[ - { - "inputs": [{ "internalType": "address", "name": "_sKLIMA", "type": "address" }], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "subtractedValue", "type": "uint256" } - ], - "name": "decreaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "addedValue", "type": "uint256" } - ], - "name": "increaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "sKLIMA", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_amount", "type": "uint256" }], - "name": "sKLIMATowKLIMA", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_amount", "type": "uint256" }], - "name": "unwrap", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_amount", "type": "uint256" }], - "name": "wKLIMATosKLIMA", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_amount", "type": "uint256" }], - "name": "wrap", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/klima/contracts/viem.contract-factory.ts b/src/apps/klima/contracts/viem.contract-factory.ts index 1a9bea8bd..5b1d67fda 100644 --- a/src/apps/klima/contracts/viem.contract-factory.ts +++ b/src/apps/klima/contracts/viem.contract-factory.ts @@ -3,12 +3,7 @@ import { Injectable, Inject } from '@nestjs/common'; import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; import { Network } from '~types/network.interface'; -import { - KlimaBondDepository__factory, - KlimaDistributor__factory, - KlimaSKlima__factory, - KlimaWsKlima__factory, -} from './viem'; +import { KlimaBondDepository__factory } from './viem'; type ContractOpts = { address: string; network: Network }; @@ -19,13 +14,4 @@ export class KlimaViemContractFactory { klimaBondDepository({ address, network }: ContractOpts) { return KlimaBondDepository__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } - klimaDistributor({ address, network }: ContractOpts) { - return KlimaDistributor__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - klimaSKlima({ address, network }: ContractOpts) { - return KlimaSKlima__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - klimaWsKlima({ address, network }: ContractOpts) { - return KlimaWsKlima__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } } diff --git a/src/apps/klima/contracts/viem/KlimaDistributor.ts b/src/apps/klima/contracts/viem/KlimaDistributor.ts deleted file mode 100644 index 0f449b18c..000000000 --- a/src/apps/klima/contracts/viem/KlimaDistributor.ts +++ /dev/null @@ -1,321 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const klimaDistributorAbi = [ - { - inputs: [ - { - internalType: 'address', - name: '_treasury', - type: 'address', - }, - { - internalType: 'address', - name: '_klima', - type: 'address', - }, - { - internalType: 'uint256', - name: '_epochLength', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '_nextEpochBlock', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'previousOwner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnershipTransferred', - type: 'event', - }, - { - inputs: [], - name: 'KLIMA', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: '_rewardRate', - type: 'uint256', - }, - ], - name: 'addRecipient', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'adjustments', - outputs: [ - { - internalType: 'bool', - name: 'add', - type: 'bool', - }, - { - internalType: 'uint256', - name: 'rate', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'target', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'distribute', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'epochLength', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'info', - outputs: [ - { - internalType: 'uint256', - name: 'rate', - type: 'uint256', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'nextEpochBlock', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_rate', - type: 'uint256', - }, - ], - name: 'nextRewardAt', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_recipient', - type: 'address', - }, - ], - name: 'nextRewardFor', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'policy', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'pullPolicy', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newPolicy_', - type: 'address', - }, - ], - name: 'pushPolicy', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_index', - type: 'uint256', - }, - { - internalType: 'address', - name: '_recipient', - type: 'address', - }, - ], - name: 'removeRecipient', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'renouncePolicy', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_index', - type: 'uint256', - }, - { - internalType: 'bool', - name: '_add', - type: 'bool', - }, - { - internalType: 'uint256', - name: '_rate', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '_target', - type: 'uint256', - }, - ], - name: 'setAdjustment', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'treasury', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, -] as const; - -export type KlimaDistributor = typeof klimaDistributorAbi; -export type KlimaDistributorContract = GetContractReturnType; - -export class KlimaDistributor__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: klimaDistributorAbi, publicClient: client }); - } -} diff --git a/src/apps/klima/contracts/viem/KlimaSKlima.ts b/src/apps/klima/contracts/viem/KlimaSKlima.ts deleted file mode 100644 index a3ab395bc..000000000 --- a/src/apps/klima/contracts/viem/KlimaSKlima.ts +++ /dev/null @@ -1,734 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const klimaSKlimaAbi = [ - { - inputs: [], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'rebase', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - ], - name: 'LogRebase', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'stakingContract', - type: 'address', - }, - ], - name: 'LogStakingContractUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'timestamp', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'totalSupply', - type: 'uint256', - }, - ], - name: 'LogSupply', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'previousOwner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnershipPulled', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'previousOwner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnershipPushed', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - inputs: [], - name: 'DOMAIN_SEPARATOR', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'INDEX', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'PERMIT_TYPEHASH', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner_', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'gons', - type: 'uint256', - }, - ], - name: 'balanceForGons', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'who', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'circulatingSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'subtractedValue', - type: 'uint256', - }, - ], - name: 'decreaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'gonsForBalance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'addedValue', - type: 'uint256', - }, - ], - name: 'increaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'index', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'stakingContract_', - type: 'address', - }, - ], - name: 'initialize', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'initializer', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'manager', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'nonces', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - ], - name: 'permit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'pullManagement', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newOwner_', - type: 'address', - }, - ], - name: 'pushManagement', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'profit_', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'epoch_', - type: 'uint256', - }, - ], - name: 'rebase', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'rebases', - outputs: [ - { - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'rebase', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalStakedBefore', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalStakedAfter', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'amountRebased', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'blockNumberOccured', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'renounceManagement', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_INDEX', - type: 'uint256', - }, - ], - name: 'setIndex', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'stakingContract', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type KlimaSKlima = typeof klimaSKlimaAbi; -export type KlimaSKlimaContract = GetContractReturnType; - -export class KlimaSKlima__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: klimaSKlimaAbi, publicClient: client }); - } -} diff --git a/src/apps/klima/contracts/viem/KlimaWsKlima.ts b/src/apps/klima/contracts/viem/KlimaWsKlima.ts deleted file mode 100644 index f7f6ef14a..000000000 --- a/src/apps/klima/contracts/viem/KlimaWsKlima.ts +++ /dev/null @@ -1,386 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const klimaWsKlimaAbi = [ - { - inputs: [ - { - internalType: 'address', - name: '_sKLIMA', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'subtractedValue', - type: 'uint256', - }, - ], - name: 'decreaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'addedValue', - type: 'uint256', - }, - ], - name: 'increaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'sKLIMA', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'sKLIMATowKLIMA', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'unwrap', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'wKLIMATosKLIMA', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'wrap', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type KlimaWsKlima = typeof klimaWsKlimaAbi; -export type KlimaWsKlimaContract = GetContractReturnType; - -export class KlimaWsKlima__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: klimaWsKlimaAbi, publicClient: client }); - } -} diff --git a/src/apps/klima/contracts/viem/index.ts b/src/apps/klima/contracts/viem/index.ts index 8a5607236..2d206d5c1 100644 --- a/src/apps/klima/contracts/viem/index.ts +++ b/src/apps/klima/contracts/viem/index.ts @@ -3,11 +3,5 @@ /* eslint-disable */ export type { KlimaBondDepository } from './KlimaBondDepository'; -export type { KlimaDistributor } from './KlimaDistributor'; -export type { KlimaSKlima } from './KlimaSKlima'; -export type { KlimaWsKlima } from './KlimaWsKlima'; export { KlimaBondDepository__factory } from './KlimaBondDepository'; -export { KlimaDistributor__factory } from './KlimaDistributor'; -export { KlimaSKlima__factory } from './KlimaSKlima'; -export { KlimaWsKlima__factory } from './KlimaWsKlima'; diff --git a/src/apps/klima/klima.module.ts b/src/apps/klima/klima.module.ts index 2e99bbda5..eed66d485 100644 --- a/src/apps/klima/klima.module.ts +++ b/src/apps/klima/klima.module.ts @@ -4,16 +4,12 @@ import { AbstractApp } from '~app/app.dynamic-module'; import { KlimaViemContractFactory } from './contracts'; import { PolygonKlimaBondContractPositionFetcher } from './polygon/klima.bond.contract-position-fetcher'; -import { PolygonKlimaSKlimaTokenFetcher } from './polygon/klima.s-klima.token-fetcher'; -import { PolygonKlimaWsKlimaTokenFetcher } from './polygon/klima.ws-klima.token-fetcher'; @Module({ providers: [ KlimaViemContractFactory, // Polygon PolygonKlimaBondContractPositionFetcher, - PolygonKlimaSKlimaTokenFetcher, - PolygonKlimaWsKlimaTokenFetcher, ], }) export class KlimaAppModule extends AbstractApp() {} diff --git a/src/apps/klima/polygon/klima.s-klima.token-fetcher.ts b/src/apps/klima/polygon/klima.s-klima.token-fetcher.ts deleted file mode 100644 index a62760ff2..000000000 --- a/src/apps/klima/polygon/klima.s-klima.token-fetcher.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { Inject } from '@nestjs/common'; -import axios from 'axios'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { Cache } from '~cache/cache.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import type { - DefaultAppTokenDataProps, - GetAddressesParams, - GetDataPropsParams, - GetDefinitionsParams, - GetUnderlyingTokensParams, -} from '~position/template/app-token.template.types'; - -import { KlimaViemContractFactory } from '../contracts'; -import { KlimaSKlima } from '../contracts/viem'; - -export const API_BASE_URL = 'https://www.klimadao.finance/api'; -export const EPOCH_INTERVAL = 11_520; -export const FALLBACK_BLOCK_RATE = 2.3; - -export type SKlimaTokenDefinition = { - address: string; - underlyingAddress: string; - reserve: number; - apy: number; -}; - -@PositionTemplate() -export class PolygonKlimaSKlimaTokenFetcher extends AppTokenTemplatePositionFetcher< - KlimaSKlima, - DefaultAppTokenDataProps, - SKlimaTokenDefinition -> { - groupLabel = 'sKLIMA'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(KlimaViemContractFactory) protected readonly contractFactory: KlimaViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.klimaSKlima({ address, network: this.network }); - } - - async getAddresses({ definitions }: GetAddressesParams) { - return definitions.map(v => v.address); - } - - async getUnderlyingTokenDefinitions({ definition }: GetUnderlyingTokensParams) { - return [{ address: definition.underlyingAddress, network: this.network }]; - } - - async getPricePerShare() { - return [1]; - } - - async getLiquidity({ - definition, - appToken: { tokens }, - }: GetDataPropsParams) { - return definition.reserve * tokens[0].price; - } - - async getReserves({ definition }: GetDataPropsParams) { - return [definition.reserve]; - } - - async getApy({ definition }: GetDataPropsParams) { - return definition.apy * 100; - } - - async getDefinitions({ multicall }: GetDefinitionsParams) { - const address = '0xb0c22d8d350c67420f06f48936654f567c73e8c8'; - const reserveAddress = '0x25d28a24ceb6f81015bb0b2007d795acac411b4d'; - const underlyingAddress = '0x4e78011ce80ee02d2c3e649fb657e45898257815'; - const distributorAddress = '0x4cc7584c3f8faabf734374ef129df17c3517e9cb'; - - const sKlima = multicall.wrap(this.getContract(address)); - const distributor = multicall.wrap( - this.contractFactory.klimaDistributor({ address: distributorAddress, network: this.network }), - ); - const underlyingToken = multicall.wrap( - this.appToolkit.globalViemContracts.erc20({ address: underlyingAddress, network: this.network }), - ); - - const [info, circulatingSupply, decimals, reserveRaw, blockRate] = await Promise.all([ - distributor.read.info([BigInt(0)]), - sKlima.read.circulatingSupply(), - underlyingToken.read.decimals(), - underlyingToken.read.balanceOf([reserveAddress]), - this.getBlockRate(), - ]); - - const stakingReward = await distributor.read.nextRewardAt([info[0]]); - const stakingRebase = Number(stakingReward) / Number(circulatingSupply); - const rebasesPerDay = 86_400 / (blockRate * EPOCH_INTERVAL); - return [ - { - address, - underlyingAddress, - reserve: Number(reserveRaw) / 10 ** decimals, - apy: Math.pow(1 + stakingRebase, 365 * rebasesPerDay) - 1, - }, - ]; - } - - @Cache({ key: `studio:klima:block-rate`, ttl: 5 * 60 }) - private async getBlockRate() { - try { - const { data } = await axios.get<{ blockRate30Day: string }>(`${API_BASE_URL}/block-rate`); - return Number(data.blockRate30Day); - } catch { - return FALLBACK_BLOCK_RATE; - } - } -} diff --git a/src/apps/klima/polygon/klima.ws-klima.token-fetcher.ts b/src/apps/klima/polygon/klima.ws-klima.token-fetcher.ts deleted file mode 100644 index cda39b480..000000000 --- a/src/apps/klima/polygon/klima.ws-klima.token-fetcher.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetPricePerShareParams, GetUnderlyingTokensParams } from '~position/template/app-token.template.types'; - -import { KlimaViemContractFactory } from '../contracts'; -import { KlimaWsKlima } from '../contracts/viem'; - -@PositionTemplate() -export class PolygonKlimaWsKlimaTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'wsKLIMA'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(KlimaViemContractFactory) protected readonly contractFactory: KlimaViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.klimaWsKlima({ address, network: this.network }); - } - - async getAddresses() { - return ['0x6f370dba99e32a3cad959b341120db3c9e280ba6']; - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.sKLIMA(), network: this.network }]; - } - - async getPricePerShare({ appToken, multicall }: GetPricePerShareParams) { - const reserveRaw = await multicall - .wrap(this.appToolkit.globalViemContracts.erc20(appToken.tokens[0])) - .read.balanceOf([appToken.address]); - - const reserve = Number(reserveRaw) / 10 ** appToken.tokens[0].decimals; - const pricePerShare = reserve / appToken.supply; - return [pricePerShare]; - } -} diff --git a/src/apps/lemma-finance/lemma-finance.module.ts b/src/apps/lemma-finance/lemma-finance.module.ts index 5b06a3dd9..51f464a90 100644 --- a/src/apps/lemma-finance/lemma-finance.module.ts +++ b/src/apps/lemma-finance/lemma-finance.module.ts @@ -6,7 +6,6 @@ import { LemmaFinanceViemContractFactory } from './contracts'; import { OptimismLemmaFinanceSynthTokenFetcher } from './optimism/lemma-finance.synth.token-fetcher'; import { OptimismLemmaFinanceUsdlTokenFetcher } from './optimism/lemma-finance.usdl.token-fetcher'; import { OptimismLemmaFinanceXSynthTokenFetcher } from './optimism/lemma-finance.x-synth.token-fetcher'; -import { OptimismLemmaFinanceXUsdlTokenFetcher } from './optimism/lemma-finance.x-usdl.token-fetcher'; @Module({ providers: [ @@ -15,7 +14,6 @@ import { OptimismLemmaFinanceXUsdlTokenFetcher } from './optimism/lemma-finance. OptimismLemmaFinanceSynthTokenFetcher, OptimismLemmaFinanceUsdlTokenFetcher, OptimismLemmaFinanceXSynthTokenFetcher, - OptimismLemmaFinanceXUsdlTokenFetcher, ], }) export class LemmaFinanceAppModule extends AbstractApp() {} diff --git a/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts b/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts deleted file mode 100644 index f873d7276..000000000 --- a/src/apps/lemma-finance/optimism/lemma-finance.x-usdl.token-fetcher.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetPricePerShareParams } from '~position/template/app-token.template.types'; - -import { LemmaFinanceViemContractFactory } from '../contracts'; -import { LemmaXUsdl } from '../contracts/viem'; - -@PositionTemplate() -export class OptimismLemmaFinanceXUsdlTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'xUSDL'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(LemmaFinanceViemContractFactory) protected readonly contractFactory: LemmaFinanceViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.lemmaXUsdl({ address, network: this.network }); - } - - async getAddresses() { - return ['0x252ea7e68a27390ce0d53851192839a39ab8b38c']; - } - - async getUnderlyingTokenDefinitions() { - return [{ address: '0x96f2539d3684dbde8b3242a51a73b66360a5b541', network: this.network }]; - } - - async getPricePerShare({ contract, appToken }: GetPricePerShareParams) { - const pricePerShareRaw = await contract.read.assetsPerShare(); - const pricePerShare = Number(pricePerShareRaw) / 10 ** appToken.decimals; - return [1 / pricePerShare]; - } -} diff --git a/src/apps/llama-airforce/contracts/abis/llama-airforce-union-vault-pirex.json b/src/apps/llama-airforce/contracts/abis/llama-airforce-union-vault-pirex.json deleted file mode 100644 index 8616eeb15..000000000 --- a/src/apps/llama-airforce/contracts/abis/llama-airforce-union-vault-pirex.json +++ /dev/null @@ -1,560 +0,0 @@ -[ - { - "inputs": [{ "internalType": "address", "name": "pxCvx", "type": "address" }], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { "inputs": [], "name": "AlreadySet", "type": "error" }, - { "inputs": [], "name": "ExceedsMax", "type": "error" }, - { "inputs": [], "name": "ZeroAddress", "type": "error" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "caller", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "Deposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "caller", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Harvest", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "fee", - "type": "uint256" - } - ], - "name": "PlatformFeeUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_platform", - "type": "address" - } - ], - "name": "PlatformUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_strategy", - "type": "address" - } - ], - "name": "StrategySet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "caller", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "Withdraw", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "penalty", - "type": "uint256" - } - ], - "name": "WithdrawalPenaltyUpdated", - "type": "event" - }, - { - "inputs": [], - "name": "DOMAIN_SEPARATOR", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "FEE_DENOMINATOR", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_PLATFORM_FEE", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_WITHDRAWAL_PENALTY", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "address", "name": "", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "asset", - "outputs": [{ "internalType": "contract ERC20", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "shares", "type": "uint256" }], - "name": "convertToAssets", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "assets", "type": "uint256" }], - "name": "convertToShares", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "assets", "type": "uint256" }, - { "internalType": "address", "name": "receiver", "type": "address" } - ], - "name": "deposit", - "outputs": [{ "internalType": "uint256", "name": "shares", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "harvest", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "maxDeposit", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "maxMint", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], - "name": "maxRedeem", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], - "name": "maxWithdraw", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "shares", "type": "uint256" }, - { "internalType": "address", "name": "receiver", "type": "address" } - ], - "name": "mint", - "outputs": [{ "internalType": "uint256", "name": "assets", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "nonces", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" }, - { "internalType": "uint256", "name": "deadline", "type": "uint256" }, - { "internalType": "uint8", "name": "v", "type": "uint8" }, - { "internalType": "bytes32", "name": "r", "type": "bytes32" }, - { "internalType": "bytes32", "name": "s", "type": "bytes32" } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "platform", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "platformFee", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "assets", "type": "uint256" }], - "name": "previewDeposit", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "shares", "type": "uint256" }], - "name": "previewMint", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "shares", "type": "uint256" }], - "name": "previewRedeem", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "assets", "type": "uint256" }], - "name": "previewWithdraw", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "shares", "type": "uint256" }, - { "internalType": "address", "name": "receiver", "type": "address" }, - { "internalType": "address", "name": "owner", "type": "address" } - ], - "name": "redeem", - "outputs": [{ "internalType": "uint256", "name": "assets", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_platform", "type": "address" }], - "name": "setPlatform", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "fee", "type": "uint256" }], - "name": "setPlatformFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_strategy", "type": "address" }], - "name": "setStrategy", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "penalty", "type": "uint256" }], - "name": "setWithdrawalPenalty", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "strategy", - "outputs": [ - { - "internalType": "contract UnionPirexStaking", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalAssets", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "assets", "type": "uint256" }, - { "internalType": "address", "name": "receiver", "type": "address" }, - { "internalType": "address", "name": "owner", "type": "address" } - ], - "name": "withdraw", - "outputs": [{ "internalType": "uint256", "name": "shares", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "withdrawalPenalty", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - } -] diff --git a/src/apps/llama-airforce/contracts/abis/llama-airforce-union-vault.json b/src/apps/llama-airforce/contracts/abis/llama-airforce-union-vault.json deleted file mode 100644 index ea9614cb0..000000000 --- a/src/apps/llama-airforce/contracts/abis/llama-airforce-union-vault.json +++ /dev/null @@ -1,494 +0,0 @@ -[ - { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256", "name": "_incentive", "type": "uint256" }], - "name": "CallerIncentiveUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "_from", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "_to", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "_value", "type": "uint256" } - ], - "name": "Deposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "_caller", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "_value", "type": "uint256" } - ], - "name": "Harvest", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256", "name": "_fee", "type": "uint256" }], - "name": "PlatformFeeUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": true, "internalType": "address", "name": "_platform", "type": "address" }], - "name": "PlatformUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "_from", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "_to", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "_value", "type": "uint256" } - ], - "name": "Withdraw", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256", "name": "_penalty", "type": "uint256" }], - "name": "WithdrawalPenaltyUpdated", - "type": "event" - }, - { - "inputs": [], - "name": "CRVETH_CRV_INDEX", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CRVETH_ETH_INDEX", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CRV_TOKEN", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CURVE_CRV_ETH_POOL", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CURVE_CVXCRV_CRV_POOL", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CURVE_CVX_ETH_POOL", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CVXCRV_CRV_INDEX", - "outputs": [{ "internalType": "int128", "name": "", "type": "int128" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CVXCRV_CVXCRV_INDEX", - "outputs": [{ "internalType": "int128", "name": "", "type": "int128" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CVXCRV_STAKING_CONTRACT", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CVXCRV_TOKEN", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CVXETH_CVX_INDEX", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CVXETH_ETH_INDEX", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "CVX_TOKEN", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "FEE_DENOMINATOR", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_CALL_INCENTIVE", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_PLATFORM_FEE", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MAX_WITHDRAWAL_PENALTY", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "user", "type": "address" }], - "name": "balanceOfUnderlying", - "outputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "callIncentive", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "subtractedValue", "type": "uint256" } - ], - "name": "decreaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_to", "type": "address" }, - { "internalType": "uint256", "name": "_amount", "type": "uint256" } - ], - "name": "deposit", - "outputs": [{ "internalType": "uint256", "name": "_shares", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_to", "type": "address" }], - "name": "depositAll", - "outputs": [{ "internalType": "uint256", "name": "_shares", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { "inputs": [], "name": "harvest", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "addedValue", "type": "uint256" } - ], - "name": "increaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "outstanding3CrvRewards", - "outputs": [{ "internalType": "uint256", "name": "total", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "outstandingCrvRewards", - "outputs": [{ "internalType": "uint256", "name": "total", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "outstandingCvxRewards", - "outputs": [{ "internalType": "uint256", "name": "total", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "platform", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "platformFee", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { "inputs": [], "name": "setApprovals", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [{ "internalType": "uint256", "name": "_incentive", "type": "uint256" }], - "name": "setCallIncentive", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_platform", "type": "address" }], - "name": "setPlatform", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_fee", "type": "uint256" }], - "name": "setPlatformFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_penalty", "type": "uint256" }], - "name": "setWithdrawalPenalty", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalUnderlying", - "outputs": [{ "internalType": "uint256", "name": "total", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "underlying", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_to", "type": "address" }, - { "internalType": "uint256", "name": "_shares", "type": "uint256" } - ], - "name": "withdraw", - "outputs": [{ "internalType": "uint256", "name": "withdrawn", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_to", "type": "address" }], - "name": "withdrawAll", - "outputs": [{ "internalType": "uint256", "name": "withdrawn", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_to", "type": "address" }, - { "internalType": "enum ClaimZaps.Option", "name": "option", "type": "uint8" }, - { "internalType": "uint256", "name": "minAmountOut", "type": "uint256" } - ], - "name": "withdrawAllAs", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_to", "type": "address" }, - { "internalType": "enum ClaimZaps.Option", "name": "option", "type": "uint8" } - ], - "name": "withdrawAllAs", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_to", "type": "address" }, - { "internalType": "uint256", "name": "_shares", "type": "uint256" }, - { "internalType": "enum ClaimZaps.Option", "name": "option", "type": "uint8" } - ], - "name": "withdrawAs", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_to", "type": "address" }, - { "internalType": "uint256", "name": "_shares", "type": "uint256" }, - { "internalType": "enum ClaimZaps.Option", "name": "option", "type": "uint8" }, - { "internalType": "uint256", "name": "minAmountOut", "type": "uint256" } - ], - "name": "withdrawAs", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "withdrawalPenalty", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { "stateMutability": "payable", "type": "receive" } -] diff --git a/src/apps/llama-airforce/contracts/viem.contract-factory.ts b/src/apps/llama-airforce/contracts/viem.contract-factory.ts index 4735a9123..8da0ccaaf 100644 --- a/src/apps/llama-airforce/contracts/viem.contract-factory.ts +++ b/src/apps/llama-airforce/contracts/viem.contract-factory.ts @@ -3,11 +3,7 @@ import { Injectable, Inject } from '@nestjs/common'; import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; import { Network } from '~types/network.interface'; -import { - LlamaAirforceMerkleDistributor__factory, - LlamaAirforceUnionVault__factory, - LlamaAirforceUnionVaultPirex__factory, -} from './viem'; +import { LlamaAirforceMerkleDistributor__factory } from './viem'; type ContractOpts = { address: string; network: Network }; @@ -18,10 +14,4 @@ export class LlamaAirforceViemContractFactory { llamaAirforceMerkleDistributor({ address, network }: ContractOpts) { return LlamaAirforceMerkleDistributor__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } - llamaAirforceUnionVault({ address, network }: ContractOpts) { - return LlamaAirforceUnionVault__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - llamaAirforceUnionVaultPirex({ address, network }: ContractOpts) { - return LlamaAirforceUnionVaultPirex__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } } diff --git a/src/apps/llama-airforce/contracts/viem/LlamaAirforceUnionVault.ts b/src/apps/llama-airforce/contracts/viem/LlamaAirforceUnionVault.ts deleted file mode 100644 index e8b8a8903..000000000 --- a/src/apps/llama-airforce/contracts/viem/LlamaAirforceUnionVault.ts +++ /dev/null @@ -1,1069 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const llamaAirforceUnionVaultAbi = [ - { - inputs: [], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: '_incentive', - type: 'uint256', - }, - ], - name: 'CallerIncentiveUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: '_from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: '_to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: '_value', - type: 'uint256', - }, - ], - name: 'Deposit', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: '_caller', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: '_value', - type: 'uint256', - }, - ], - name: 'Harvest', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'previousOwner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnershipTransferred', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: '_fee', - type: 'uint256', - }, - ], - name: 'PlatformFeeUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: '_platform', - type: 'address', - }, - ], - name: 'PlatformUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: '_from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: '_to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: '_value', - type: 'uint256', - }, - ], - name: 'Withdraw', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: '_penalty', - type: 'uint256', - }, - ], - name: 'WithdrawalPenaltyUpdated', - type: 'event', - }, - { - inputs: [], - name: 'CRVETH_CRV_INDEX', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'CRVETH_ETH_INDEX', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'CRV_TOKEN', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'CURVE_CRV_ETH_POOL', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'CURVE_CVXCRV_CRV_POOL', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'CURVE_CVX_ETH_POOL', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'CVXCRV_CRV_INDEX', - outputs: [ - { - internalType: 'int128', - name: '', - type: 'int128', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'CVXCRV_CVXCRV_INDEX', - outputs: [ - { - internalType: 'int128', - name: '', - type: 'int128', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'CVXCRV_STAKING_CONTRACT', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'CVXCRV_TOKEN', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'CVXETH_CVX_INDEX', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'CVXETH_ETH_INDEX', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'CVX_TOKEN', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'FEE_DENOMINATOR', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'MAX_CALL_INCENTIVE', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'MAX_PLATFORM_FEE', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'MAX_WITHDRAWAL_PENALTY', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - ], - name: 'balanceOfUnderlying', - outputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'callIncentive', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'subtractedValue', - type: 'uint256', - }, - ], - name: 'decreaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_to', - type: 'address', - }, - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'deposit', - outputs: [ - { - internalType: 'uint256', - name: '_shares', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_to', - type: 'address', - }, - ], - name: 'depositAll', - outputs: [ - { - internalType: 'uint256', - name: '_shares', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'harvest', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'addedValue', - type: 'uint256', - }, - ], - name: 'increaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'outstanding3CrvRewards', - outputs: [ - { - internalType: 'uint256', - name: 'total', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'outstandingCrvRewards', - outputs: [ - { - internalType: 'uint256', - name: 'total', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'outstandingCvxRewards', - outputs: [ - { - internalType: 'uint256', - name: 'total', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'owner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'platform', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'platformFee', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'renounceOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'setApprovals', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_incentive', - type: 'uint256', - }, - ], - name: 'setCallIncentive', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_platform', - type: 'address', - }, - ], - name: 'setPlatform', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_fee', - type: 'uint256', - }, - ], - name: 'setPlatformFee', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_penalty', - type: 'uint256', - }, - ], - name: 'setWithdrawalPenalty', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalUnderlying', - outputs: [ - { - internalType: 'uint256', - name: 'total', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'transferOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'underlying', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_to', - type: 'address', - }, - { - internalType: 'uint256', - name: '_shares', - type: 'uint256', - }, - ], - name: 'withdraw', - outputs: [ - { - internalType: 'uint256', - name: 'withdrawn', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_to', - type: 'address', - }, - ], - name: 'withdrawAll', - outputs: [ - { - internalType: 'uint256', - name: 'withdrawn', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_to', - type: 'address', - }, - { - internalType: 'enum ClaimZaps.Option', - name: 'option', - type: 'uint8', - }, - { - internalType: 'uint256', - name: 'minAmountOut', - type: 'uint256', - }, - ], - name: 'withdrawAllAs', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_to', - type: 'address', - }, - { - internalType: 'enum ClaimZaps.Option', - name: 'option', - type: 'uint8', - }, - ], - name: 'withdrawAllAs', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_to', - type: 'address', - }, - { - internalType: 'uint256', - name: '_shares', - type: 'uint256', - }, - { - internalType: 'enum ClaimZaps.Option', - name: 'option', - type: 'uint8', - }, - ], - name: 'withdrawAs', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_to', - type: 'address', - }, - { - internalType: 'uint256', - name: '_shares', - type: 'uint256', - }, - { - internalType: 'enum ClaimZaps.Option', - name: 'option', - type: 'uint8', - }, - { - internalType: 'uint256', - name: 'minAmountOut', - type: 'uint256', - }, - ], - name: 'withdrawAs', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'withdrawalPenalty', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - stateMutability: 'payable', - type: 'receive', - }, -] as const; - -export type LlamaAirforceUnionVault = typeof llamaAirforceUnionVaultAbi; -export type LlamaAirforceUnionVaultContract = GetContractReturnType; - -export class LlamaAirforceUnionVault__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: llamaAirforceUnionVaultAbi, publicClient: client }); - } -} diff --git a/src/apps/llama-airforce/contracts/viem/LlamaAirforceUnionVaultPirex.ts b/src/apps/llama-airforce/contracts/viem/LlamaAirforceUnionVaultPirex.ts deleted file mode 100644 index e52978905..000000000 --- a/src/apps/llama-airforce/contracts/viem/LlamaAirforceUnionVaultPirex.ts +++ /dev/null @@ -1,1002 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const llamaAirforceUnionVaultPirexAbi = [ - { - inputs: [ - { - internalType: 'address', - name: 'pxCvx', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - inputs: [], - name: 'AlreadySet', - type: 'error', - }, - { - inputs: [], - name: 'ExceedsMax', - type: 'error', - }, - { - inputs: [], - name: 'ZeroAddress', - type: 'error', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'Deposit', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Harvest', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'previousOwner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnershipTransferred', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'fee', - type: 'uint256', - }, - ], - name: 'PlatformFeeUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: '_platform', - type: 'address', - }, - ], - name: 'PlatformUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: '_strategy', - type: 'address', - }, - ], - name: 'StrategySet', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'Withdraw', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'penalty', - type: 'uint256', - }, - ], - name: 'WithdrawalPenaltyUpdated', - type: 'event', - }, - { - inputs: [], - name: 'DOMAIN_SEPARATOR', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'FEE_DENOMINATOR', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'MAX_PLATFORM_FEE', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'MAX_WITHDRAWAL_PENALTY', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'asset', - outputs: [ - { - internalType: 'contract ERC20', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'convertToAssets', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - ], - name: 'convertToShares', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - ], - name: 'deposit', - outputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'harvest', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'maxDeposit', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'maxMint', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'maxRedeem', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'maxWithdraw', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - ], - name: 'mint', - outputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'nonces', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'owner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - ], - name: 'permit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'platform', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'platformFee', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - ], - name: 'previewDeposit', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'previewMint', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'previewRedeem', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - ], - name: 'previewWithdraw', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'redeem', - outputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'renounceOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_platform', - type: 'address', - }, - ], - name: 'setPlatform', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'fee', - type: 'uint256', - }, - ], - name: 'setPlatformFee', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_strategy', - type: 'address', - }, - ], - name: 'setStrategy', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'penalty', - type: 'uint256', - }, - ], - name: 'setWithdrawalPenalty', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'strategy', - outputs: [ - { - internalType: 'contract UnionPirexStaking', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalAssets', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'transferOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'withdraw', - outputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'withdrawalPenalty', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, -] as const; - -export type LlamaAirforceUnionVaultPirex = typeof llamaAirforceUnionVaultPirexAbi; -export type LlamaAirforceUnionVaultPirexContract = GetContractReturnType; - -export class LlamaAirforceUnionVaultPirex__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: llamaAirforceUnionVaultPirexAbi, publicClient: client }); - } -} diff --git a/src/apps/llama-airforce/contracts/viem/index.ts b/src/apps/llama-airforce/contracts/viem/index.ts index e2a089c89..0e33a7958 100644 --- a/src/apps/llama-airforce/contracts/viem/index.ts +++ b/src/apps/llama-airforce/contracts/viem/index.ts @@ -3,9 +3,5 @@ /* eslint-disable */ export type { LlamaAirforceMerkleDistributor } from './LlamaAirforceMerkleDistributor'; -export type { LlamaAirforceUnionVaultPirex } from './LlamaAirforceUnionVaultPirex'; -export type { LlamaAirforceUnionVault } from './LlamaAirforceUnionVault'; export { LlamaAirforceMerkleDistributor__factory } from './LlamaAirforceMerkleDistributor'; -export { LlamaAirforceUnionVaultPirex__factory } from './LlamaAirforceUnionVaultPirex'; -export { LlamaAirforceUnionVault__factory } from './LlamaAirforceUnionVault'; diff --git a/src/apps/llama-airforce/ethereum/llama-airforce.vault.token-fetcher.ts b/src/apps/llama-airforce/ethereum/llama-airforce.vault.token-fetcher.ts deleted file mode 100644 index 5a793390e..000000000 --- a/src/apps/llama-airforce/ethereum/llama-airforce.vault.token-fetcher.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { getLabelFromToken } from '~app-toolkit/helpers/presentation/image.present'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetDisplayPropsParams, - GetPricePerShareParams, - GetUnderlyingTokensParams, -} from '~position/template/app-token.template.types'; - -import { LlamaAirforceViemContractFactory } from '../contracts'; -import { LlamaAirforceUnionVault } from '../contracts/viem'; - -@PositionTemplate() -export class EthereumLlamaAirforceVaultTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Vaults'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(LlamaAirforceViemContractFactory) protected readonly contractFactory: LlamaAirforceViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.llamaAirforceUnionVault({ address, network: this.network }); - } - - getAddresses() { - return [ - '0x83507cc8c8b67ed48badd1f59f684d5d02884c81', // uCRV - '0x4ebad8dbd4edbd74db0278714fbd67ebc76b89b7', // uCRV V2 - '0xde2bef0a01845257b4aef2a2eaa48f6eaeafa8b7', // uCRV V3 - '0xf964b0e3ffdea659c44a5a52bc0b82a24b89ce0e', // uFXS - '0x3a886455e5b33300a31c5e77bac01e76c0c7b29c', // uFXS V2 - '0x8659fc767cad6005de79af65dafe4249c57927af', // uCVX - '0xd6fc1ecd9965ba9cac895654979564a291c74c29', // uauraBAL - '0x8c4eb0fc6805ee7337ac126f89a807271a88dd67', // uauraBAL v2 - ]; - } - - async getUnderlyingTokenDefinitions({ - address, - contract, - multicall, - }: GetUnderlyingTokensParams) { - if (address === '0x8659fc767cad6005de79af65dafe4249c57927af') { - const pirexContract = this.contractFactory.llamaAirforceUnionVaultPirex({ address, network: this.network }); - return [{ address: await multicall.wrap(pirexContract).read.asset(), network: this.network }]; - } - - return [{ address: await contract.read.underlying(), network: this.network }]; - } - - async getPricePerShare({ contract, appToken, multicall }: GetPricePerShareParams) { - if (appToken.address === '0x8659fc767cad6005de79af65dafe4249c57927af') { - const pirexContract = this.contractFactory.llamaAirforceUnionVaultPirex({ - address: appToken.address, - network: this.network, - }); - - const reserveRaw = await multicall.wrap(pirexContract).read.totalAssets(); - const reserve = Number(reserveRaw) / 10 ** appToken.tokens[0].decimals; - const pricePerShare = reserve / appToken.supply; - return [pricePerShare]; - } - - const reserveRaw = await contract.read.totalUnderlying(); - const reserve = Number(reserveRaw) / 10 ** appToken.tokens[0].decimals; - const pricePerShare = reserve / appToken.supply; - return [pricePerShare]; - } - - async getLabel({ appToken }: GetDisplayPropsParams) { - return `${getLabelFromToken(appToken.tokens[0])} Pounder`; - } -} diff --git a/src/apps/llama-airforce/llama-airforce.module.ts b/src/apps/llama-airforce/llama-airforce.module.ts index 94ae3d840..c936e3f20 100644 --- a/src/apps/llama-airforce/llama-airforce.module.ts +++ b/src/apps/llama-airforce/llama-airforce.module.ts @@ -5,7 +5,6 @@ import { AbstractApp } from '~app/app.dynamic-module'; import { LlamaAirforceViemContractFactory } from './contracts'; import { EthereumLlamaAirforceAirdropContractPositionFetcher } from './ethereum/llama-airforce.airdrop.contract-position-fetcher'; import { EthereumLlamaAirforceMerkleCache } from './ethereum/llama-airforce.merkle-cache'; -import { EthereumLlamaAirforceVaultTokenFetcher } from './ethereum/llama-airforce.vault.token-fetcher'; @Module({ providers: [ @@ -13,7 +12,6 @@ import { EthereumLlamaAirforceVaultTokenFetcher } from './ethereum/llama-airforc // Ethereum EthereumLlamaAirforceMerkleCache, EthereumLlamaAirforceAirdropContractPositionFetcher, - EthereumLlamaAirforceVaultTokenFetcher, ], }) export class LlamaAirforceAppModule extends AbstractApp() {} diff --git a/src/apps/meshswap/assets/logo.png b/src/apps/meshswap/assets/logo.png deleted file mode 100644 index 4e0346c3daec9a17ce7037f535a0d927b16a03b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13864 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 E1GQh11ONa4 diff --git a/src/apps/meshswap/contracts/abis/meshswap-single-pool-factory.json b/src/apps/meshswap/contracts/abis/meshswap-single-pool-factory.json deleted file mode 100644 index a29924569..000000000 --- a/src/apps/meshswap/contracts/abis/meshswap-single-pool-factory.json +++ /dev/null @@ -1,569 +0,0 @@ -[ - { - "constant": false, - "inputs": [{ "name": "newOperator", "type": "address" }], - "name": "changeOperator", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "user", "type": "address" }, - { "name": "amount", "type": "uint256" } - ], - "name": "sendReward", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "token", "type": "address" }, - { "name": "user", "type": "address" }, - { "name": "insurance", "type": "address" } - ], - "name": "transferDebt", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "newInterestRateModel", "type": "address" }], - "name": "changeInterestRateModel", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "plusPoolFactory", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "nativeWithdrawer", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "token", "type": "address" }, - { "name": "newReserveFactor", "type": "uint256" } - ], - "name": "setPoolReserveFactor", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "idx", "type": "uint256" }], - "name": "getPoolAddressByIndex", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "token", "type": "address" }, - { "name": "user", "type": "address" }, - { "name": "amount", "type": "uint256" } - ], - "name": "repay", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": true, - "stateMutability": "payable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "token", "type": "address" }, - { "name": "plusPoolAddress", "type": "address" }, - { "name": "amount", "type": "uint256" } - ], - "name": "repayInsurance", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": true, - "stateMutability": "payable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getPlusPoolFactory", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "name": "token", "type": "address" }, - { "name": "user", "type": "address" }, - { "name": "poolAddress", "type": "address" } - ], - "name": "borrowBalanceInfo", - "outputs": [ - { "name": "", "type": "uint256" }, - { "name": "", "type": "uint256" } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "pools", "type": "address[]" }, - { "name": "rate", "type": "uint256[]" } - ], - "name": "changeMiningRate", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "token", "type": "address" }, - { "name": "user", "type": "address" }, - { "name": "poolAddress", "type": "address" } - ], - "name": "borrowBalanceCurrent", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "", "type": "uint256" }], - "name": "singlePools", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "token", "type": "address" }, - { "name": "user", "type": "address" }, - { "name": "amount", "type": "uint256" } - ], - "name": "borrow", - "outputs": [ - { "name": "", "type": "uint256" }, - { "name": "", "type": "uint256" } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "", "type": "address" }], - "name": "singlePoolVault", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "version", - "outputs": [{ "name": "", "type": "string" }], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalMined", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "operator", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "governance", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "tokenAddress", "type": "address" }, - { "name": "b", "type": "bool" } - ], - "name": "setWithdrawActive", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "_nextOwner", "type": "address" }], - "name": "changeNextOwner", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "changeOwner", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "mining", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "", "type": "address" }], - "name": "singlePoolExist", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "nextOwner", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getTotalMined", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "newNativeWithdrawer", "type": "address" }], - "name": "changeNativeWithdrawer", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "owner", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getPoolCount", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "token", "type": "address" }], - "name": "createPool", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "newSinglePoolImpl", "type": "address" }], - "name": "setSinglePoolImpl", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "name": "token", "type": "address" }, - { "name": "user", "type": "address" }, - { "name": "poolAddress", "type": "address" } - ], - "name": "borrowBalanceStored", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "entered", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "WETH", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "tokenAddress", "type": "address" }, - { "name": "b", "type": "bool" } - ], - "name": "setDepositActive", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "lastMined", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "admin", "type": "address" }, - { "name": "token", "type": "address" }, - { "name": "reduceAmount", "type": "uint256" } - ], - "name": "reducePoolReserves", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "newPlusPoolFactory", "type": "address" }], - "name": "setPlusPoolFactory", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "singlePoolImpl", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "tokenAddress", "type": "address" }, - { "name": "newInterestRateModel", "type": "address" } - ], - "name": "setPoolInterestRateModel", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_owner", "type": "address" }, - { "name": "_governance", "type": "address" }, - { "name": "_singlePoolImpl", "type": "address" }, - { "name": "_interestRateModel", "type": "address" } - ], - "name": "__SinglePoolFactory_init", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "interestRateModel", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "mesh", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "updateTotalMined", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "token", "type": "address" }], - "name": "getPoolAddressByToken", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { "payable": true, "stateMutability": "payable", "type": "fallback" }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "name": "nextOwner", "type": "address" }], - "name": "ChangeNextOwner", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "name": "owner", "type": "address" }], - "name": "ChangeOwner", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "name": "newOperator", "type": "address" }], - "name": "ChangeOperator", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "name": "newInterestRateModel", "type": "address" }], - "name": "ChangeInterestRateModel", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "name": "newNativeWithdrawer", "type": "address" }], - "name": "ChangeNativeWithdrawer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "token", "type": "address" }, - { "indexed": false, "name": "pool", "type": "address" }, - { "indexed": false, "name": "exid", "type": "uint256" } - ], - "name": "CreatePool", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "poolAddress", "type": "address" }, - { "indexed": false, "name": "b", "type": "bool" } - ], - "name": "SetDepositActive", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "poolAddress", "type": "address" }, - { "indexed": false, "name": "b", "type": "bool" } - ], - "name": "SetWithdrawActive", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "pool", "type": "address" }, - { "indexed": false, "name": "newInterestRateModel", "type": "address" } - ], - "name": "SetPoolInterestRateModel", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "name": "_mining", "type": "uint256" }], - "name": "ChangeMiningRate", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "_lastMined", "type": "uint256" }, - { "indexed": false, "name": "_totalMined", "type": "uint256" } - ], - "name": "UpdateLastMined", - "type": "event" - } -] diff --git a/src/apps/meshswap/contracts/abis/meshswap-single-pool.json b/src/apps/meshswap/contracts/abis/meshswap-single-pool.json deleted file mode 100644 index f247117b7..000000000 --- a/src/apps/meshswap/contracts/abis/meshswap-single-pool.json +++ /dev/null @@ -1,734 +0,0 @@ -[ - { - "constant": true, - "inputs": [], - "name": "name", - "outputs": [{ "name": "", "type": "string" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "initPool", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_spender", "type": "address" }, - { "name": "_value", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "user", "type": "address" }, - { "name": "plusPoolAddress", "type": "address" }, - { "name": "insurance", "type": "address" } - ], - "name": "transferDebt", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalSupply", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "exchangeRateStored", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "newReserveFactor", "type": "uint256" }], - "name": "setReserveFactor", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_from", "type": "address" }, - { "name": "_to", "type": "address" }, - { "name": "_value", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "decimals", - "outputs": [{ "name": "", "type": "uint8" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "", "type": "address" }], - "name": "poolTotalBorrows", - "outputs": [ - { "name": "principal", "type": "uint256" }, - { "name": "interestIndex", "type": "uint256" } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "getCash", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "_mining", "type": "uint256" }], - "name": "changeMiningRate", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "reserveFactor", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalBorrows", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "singlePoolFactory", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "withdrawAmount", "type": "uint256" }], - "name": "withdrawToken", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "version", - "outputs": [{ "name": "", "type": "string" }], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "", "type": "address" }], - "name": "userRewardSum", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "poolAddress", "type": "address" }], - "name": "borrowBalancePoolTotal", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "depositAmount", "type": "uint256" }], - "name": "depositToken", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "mining", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "accrualBlockNumber", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "user", "type": "address" }, - { "name": "borrowAmount", "type": "uint256" }, - { "name": "plusPoolAddress", "type": "address" } - ], - "name": "borrow", - "outputs": [ - { "name": "", "type": "uint256" }, - { "name": "", "type": "uint256" } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "admin", "type": "address" }, - { "name": "reduceAmount", "type": "uint256" } - ], - "name": "reduceReserves", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "name": "account", "type": "address" }, - { "name": "poolAddress", "type": "address" } - ], - "name": "borrowBalanceStored", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "totalBorrowsCurrent", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "addAmount", "type": "uint256" }], - "name": "addReserves", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": true, - "stateMutability": "payable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "newInterestRateModel", "type": "address" }], - "name": "setInterestRateModel", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "miningIndex", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalReserves", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "symbol", - "outputs": [{ "name": "", "type": "string" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "accrueInterest", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "entered", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_to", "type": "address" }, - { "name": "_value", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "borrowIndex", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "supplyRatePerBlock", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "lastMined", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "withdrawActive", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "claimReward", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "exchangeRateCurrent", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "updateMiningIndex", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "b", "type": "bool" }], - "name": "setDepositActive", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "withdrawTokens", "type": "uint256" }], - "name": "withdrawETHByAmount", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "depositActive", - "outputs": [{ "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "withdrawTokens", "type": "uint256" }], - "name": "withdrawTokenByAmount", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "name": "", "type": "address" }, - { "name": "", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "user", "type": "address" }, - { "name": "repayAmount", "type": "uint256" }, - { "name": "plusPoolAddress", "type": "address" }, - { "name": "spender", "type": "address" } - ], - "name": "repayToken", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "name": "account", "type": "address" }, - { "name": "poolAddress", "type": "address" } - ], - "name": "borrowBalanceInfo", - "outputs": [ - { "name": "", "type": "uint256" }, - { "name": "", "type": "uint256" } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "account", "type": "address" }, - { "name": "poolAddress", "type": "address" } - ], - "name": "borrowBalanceCurrent", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "name": "", "type": "address" }], - "name": "userLastIndex", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "name": "_singlePoolFactoryAddress", "type": "address" }, - { "name": "_token", "type": "address" }, - { "name": "_interestRateModelAddress", "type": "address" } - ], - "name": "__SinglePool_init", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "withdrawAmount", "type": "uint256" }], - "name": "withdrawETH", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "interestRateModel", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "depositETH", - "outputs": [], - "payable": true, - "stateMutability": "payable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "name": "b", "type": "bool" }], - "name": "setWithdrawActive", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "borrowRatePerBlock", - "outputs": [{ "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "token", - "outputs": [{ "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { "payable": true, "stateMutability": "payable", "type": "fallback" }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "name": "_mining", "type": "uint256" }], - "name": "ChangeMiningRate", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "lastMined", "type": "uint256" }, - { "indexed": false, "name": "miningIndex", "type": "uint256" } - ], - "name": "UpdateMiningIndex", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "user", "type": "address" }, - { "indexed": false, "name": "amount", "type": "uint256" }, - { "indexed": false, "name": "lastIndex", "type": "uint256" }, - { "indexed": false, "name": "rewardSum", "type": "uint256" } - ], - "name": "GiveReward", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "cashPrior", "type": "uint256" }, - { "indexed": false, "name": "interestAccumulated", "type": "uint256" }, - { "indexed": false, "name": "borrowIndex", "type": "uint256" }, - { "indexed": false, "name": "totalBorrows", "type": "uint256" }, - { "indexed": false, "name": "totalReserves", "type": "uint256" } - ], - "name": "AccrueInterest", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "user", "type": "address" }, - { "indexed": false, "name": "depositAmount", "type": "uint256" }, - { "indexed": false, "name": "depositTokens", "type": "uint256" }, - { "indexed": false, "name": "totalAmount", "type": "uint256" }, - { "indexed": false, "name": "totalSupply", "type": "uint256" } - ], - "name": "Deposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "user", "type": "address" }, - { "indexed": false, "name": "withdrawAmount", "type": "uint256" }, - { "indexed": false, "name": "withdrawTokens", "type": "uint256" }, - { "indexed": false, "name": "totalAmount", "type": "uint256" }, - { "indexed": false, "name": "totalSupply", "type": "uint256" } - ], - "name": "Withdraw", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "user", "type": "address" }, - { "indexed": false, "name": "plusPoolAddress", "type": "address" }, - { "indexed": false, "name": "borrowAmount", "type": "uint256" }, - { "indexed": false, "name": "accountBorrows", "type": "uint256" }, - { "indexed": false, "name": "totalBorrows", "type": "uint256" } - ], - "name": "Borrow", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "user", "type": "address" }, - { "indexed": false, "name": "plusPoolAddress", "type": "address" }, - { "indexed": false, "name": "repayAmount", "type": "uint256" }, - { "indexed": false, "name": "accountBorrows", "type": "uint256" }, - { "indexed": false, "name": "totalBorrows", "type": "uint256" } - ], - "name": "Repay", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "user", "type": "address" }, - { "indexed": false, "name": "plusPoolAddress", "type": "address" }, - { "indexed": false, "name": "insurance", "type": "address" }, - { "indexed": false, "name": "userDebt", "type": "uint256" }, - { "indexed": false, "name": "insuranceDebtBefore", "type": "uint256" }, - { "indexed": false, "name": "insuranceDebt", "type": "uint256" }, - { "indexed": false, "name": "borrowIndex", "type": "uint256" } - ], - "name": "TransferDebt", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "oldReserveFactor", "type": "uint256" }, - { "indexed": false, "name": "newReserveFactor", "type": "uint256" } - ], - "name": "NewReserveFactor", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "user", "type": "address" }, - { "indexed": false, "name": "addAmount", "type": "uint256" }, - { "indexed": false, "name": "newTotalReserves", "type": "uint256" } - ], - "name": "ReservesAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "admin", "type": "address" }, - { "indexed": false, "name": "reduceAmount", "type": "uint256" }, - { "indexed": false, "name": "newTotalReserves", "type": "uint256" } - ], - "name": "ReservesReduced", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "name": "oldInterestRateModel", "type": "address" }, - { "indexed": false, "name": "newInterestRateModel", "type": "address" } - ], - "name": "NewMarketInterestRateModel", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "name": "from", "type": "address" }, - { "indexed": true, "name": "to", "type": "address" }, - { "indexed": false, "name": "amount", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "name": "holder", "type": "address" }, - { "indexed": true, "name": "spender", "type": "address" }, - { "indexed": false, "name": "amount", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - } -] diff --git a/src/apps/meshswap/contracts/index.ts b/src/apps/meshswap/contracts/index.ts deleted file mode 100644 index 5dcfebdf6..000000000 --- a/src/apps/meshswap/contracts/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -export * from './viem.contract-factory'; diff --git a/src/apps/meshswap/contracts/viem.contract-factory.ts b/src/apps/meshswap/contracts/viem.contract-factory.ts deleted file mode 100644 index e23cbb25b..000000000 --- a/src/apps/meshswap/contracts/viem.contract-factory.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Injectable, Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { Network } from '~types/network.interface'; - -import { MeshswapSinglePool__factory, MeshswapSinglePoolFactory__factory } from './viem'; - -type ContractOpts = { address: string; network: Network }; - -@Injectable() -export class MeshswapViemContractFactory { - constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) {} - - meshswapSinglePool({ address, network }: ContractOpts) { - return MeshswapSinglePool__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - meshswapSinglePoolFactory({ address, network }: ContractOpts) { - return MeshswapSinglePoolFactory__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } -} diff --git a/src/apps/meshswap/contracts/viem/MeshswapSinglePool.ts b/src/apps/meshswap/contracts/viem/MeshswapSinglePool.ts deleted file mode 100644 index 32e40b21c..000000000 --- a/src/apps/meshswap/contracts/viem/MeshswapSinglePool.ts +++ /dev/null @@ -1,1357 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const meshswapSinglePoolAbi = [ - { - constant: true, - inputs: [], - name: 'name', - outputs: [ - { - name: '', - type: 'string', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [], - name: 'initPool', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: '_spender', - type: 'address', - }, - { - name: '_value', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'user', - type: 'address', - }, - { - name: 'plusPoolAddress', - type: 'address', - }, - { - name: 'insurance', - type: 'address', - }, - ], - name: 'transferDebt', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'totalSupply', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'exchangeRateStored', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'newReserveFactor', - type: 'uint256', - }, - ], - name: 'setReserveFactor', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: '_from', - type: 'address', - }, - { - name: '_to', - type: 'address', - }, - { - name: '_value', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'decimals', - outputs: [ - { - name: '', - type: 'uint8', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: '', - type: 'address', - }, - ], - name: 'poolTotalBorrows', - outputs: [ - { - name: 'principal', - type: 'uint256', - }, - { - name: 'interestIndex', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'getCash', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: '_mining', - type: 'uint256', - }, - ], - name: 'changeMiningRate', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'reserveFactor', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'totalBorrows', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'singlePoolFactory', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'withdrawAmount', - type: 'uint256', - }, - ], - name: 'withdrawToken', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'version', - outputs: [ - { - name: '', - type: 'string', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: '', - type: 'address', - }, - ], - name: 'userRewardSum', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: 'poolAddress', - type: 'address', - }, - ], - name: 'borrowBalancePoolTotal', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'depositAmount', - type: 'uint256', - }, - ], - name: 'depositToken', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'mining', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'accrualBlockNumber', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'user', - type: 'address', - }, - { - name: 'borrowAmount', - type: 'uint256', - }, - { - name: 'plusPoolAddress', - type: 'address', - }, - ], - name: 'borrow', - outputs: [ - { - name: '', - type: 'uint256', - }, - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'admin', - type: 'address', - }, - { - name: 'reduceAmount', - type: 'uint256', - }, - ], - name: 'reduceReserves', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: '', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: 'account', - type: 'address', - }, - { - name: 'poolAddress', - type: 'address', - }, - ], - name: 'borrowBalanceStored', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [], - name: 'totalBorrowsCurrent', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'addAmount', - type: 'uint256', - }, - ], - name: 'addReserves', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: true, - stateMutability: 'payable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'newInterestRateModel', - type: 'address', - }, - ], - name: 'setInterestRateModel', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'miningIndex', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'totalReserves', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'symbol', - outputs: [ - { - name: '', - type: 'string', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [], - name: 'accrueInterest', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'entered', - outputs: [ - { - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: '_to', - type: 'address', - }, - { - name: '_value', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'borrowIndex', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'supplyRatePerBlock', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'lastMined', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'withdrawActive', - outputs: [ - { - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [], - name: 'claimReward', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [], - name: 'exchangeRateCurrent', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [], - name: 'updateMiningIndex', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'b', - type: 'bool', - }, - ], - name: 'setDepositActive', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'withdrawTokens', - type: 'uint256', - }, - ], - name: 'withdrawETHByAmount', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'depositActive', - outputs: [ - { - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'withdrawTokens', - type: 'uint256', - }, - ], - name: 'withdrawTokenByAmount', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: '', - type: 'address', - }, - { - name: '', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'user', - type: 'address', - }, - { - name: 'repayAmount', - type: 'uint256', - }, - { - name: 'plusPoolAddress', - type: 'address', - }, - { - name: 'spender', - type: 'address', - }, - ], - name: 'repayToken', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: 'account', - type: 'address', - }, - { - name: 'poolAddress', - type: 'address', - }, - ], - name: 'borrowBalanceInfo', - outputs: [ - { - name: '', - type: 'uint256', - }, - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'account', - type: 'address', - }, - { - name: 'poolAddress', - type: 'address', - }, - ], - name: 'borrowBalanceCurrent', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: '', - type: 'address', - }, - ], - name: 'userLastIndex', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: '_singlePoolFactoryAddress', - type: 'address', - }, - { - name: '_token', - type: 'address', - }, - { - name: '_interestRateModelAddress', - type: 'address', - }, - ], - name: '__SinglePool_init', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'withdrawAmount', - type: 'uint256', - }, - ], - name: 'withdrawETH', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'interestRateModel', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [], - name: 'depositETH', - outputs: [], - payable: true, - stateMutability: 'payable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'b', - type: 'bool', - }, - ], - name: 'setWithdrawActive', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'borrowRatePerBlock', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'token', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - payable: true, - stateMutability: 'payable', - type: 'fallback', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: '_mining', - type: 'uint256', - }, - ], - name: 'ChangeMiningRate', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'lastMined', - type: 'uint256', - }, - { - indexed: false, - name: 'miningIndex', - type: 'uint256', - }, - ], - name: 'UpdateMiningIndex', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'user', - type: 'address', - }, - { - indexed: false, - name: 'amount', - type: 'uint256', - }, - { - indexed: false, - name: 'lastIndex', - type: 'uint256', - }, - { - indexed: false, - name: 'rewardSum', - type: 'uint256', - }, - ], - name: 'GiveReward', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'cashPrior', - type: 'uint256', - }, - { - indexed: false, - name: 'interestAccumulated', - type: 'uint256', - }, - { - indexed: false, - name: 'borrowIndex', - type: 'uint256', - }, - { - indexed: false, - name: 'totalBorrows', - type: 'uint256', - }, - { - indexed: false, - name: 'totalReserves', - type: 'uint256', - }, - ], - name: 'AccrueInterest', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'user', - type: 'address', - }, - { - indexed: false, - name: 'depositAmount', - type: 'uint256', - }, - { - indexed: false, - name: 'depositTokens', - type: 'uint256', - }, - { - indexed: false, - name: 'totalAmount', - type: 'uint256', - }, - { - indexed: false, - name: 'totalSupply', - type: 'uint256', - }, - ], - name: 'Deposit', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'user', - type: 'address', - }, - { - indexed: false, - name: 'withdrawAmount', - type: 'uint256', - }, - { - indexed: false, - name: 'withdrawTokens', - type: 'uint256', - }, - { - indexed: false, - name: 'totalAmount', - type: 'uint256', - }, - { - indexed: false, - name: 'totalSupply', - type: 'uint256', - }, - ], - name: 'Withdraw', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'user', - type: 'address', - }, - { - indexed: false, - name: 'plusPoolAddress', - type: 'address', - }, - { - indexed: false, - name: 'borrowAmount', - type: 'uint256', - }, - { - indexed: false, - name: 'accountBorrows', - type: 'uint256', - }, - { - indexed: false, - name: 'totalBorrows', - type: 'uint256', - }, - ], - name: 'Borrow', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'user', - type: 'address', - }, - { - indexed: false, - name: 'plusPoolAddress', - type: 'address', - }, - { - indexed: false, - name: 'repayAmount', - type: 'uint256', - }, - { - indexed: false, - name: 'accountBorrows', - type: 'uint256', - }, - { - indexed: false, - name: 'totalBorrows', - type: 'uint256', - }, - ], - name: 'Repay', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'user', - type: 'address', - }, - { - indexed: false, - name: 'plusPoolAddress', - type: 'address', - }, - { - indexed: false, - name: 'insurance', - type: 'address', - }, - { - indexed: false, - name: 'userDebt', - type: 'uint256', - }, - { - indexed: false, - name: 'insuranceDebtBefore', - type: 'uint256', - }, - { - indexed: false, - name: 'insuranceDebt', - type: 'uint256', - }, - { - indexed: false, - name: 'borrowIndex', - type: 'uint256', - }, - ], - name: 'TransferDebt', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'oldReserveFactor', - type: 'uint256', - }, - { - indexed: false, - name: 'newReserveFactor', - type: 'uint256', - }, - ], - name: 'NewReserveFactor', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'user', - type: 'address', - }, - { - indexed: false, - name: 'addAmount', - type: 'uint256', - }, - { - indexed: false, - name: 'newTotalReserves', - type: 'uint256', - }, - ], - name: 'ReservesAdded', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'admin', - type: 'address', - }, - { - indexed: false, - name: 'reduceAmount', - type: 'uint256', - }, - { - indexed: false, - name: 'newTotalReserves', - type: 'uint256', - }, - ], - name: 'ReservesReduced', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'oldInterestRateModel', - type: 'address', - }, - { - indexed: false, - name: 'newInterestRateModel', - type: 'address', - }, - ], - name: 'NewMarketInterestRateModel', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - name: 'from', - type: 'address', - }, - { - indexed: true, - name: 'to', - type: 'address', - }, - { - indexed: false, - name: 'amount', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - name: 'holder', - type: 'address', - }, - { - indexed: true, - name: 'spender', - type: 'address', - }, - { - indexed: false, - name: 'amount', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, -] as const; - -export type MeshswapSinglePool = typeof meshswapSinglePoolAbi; -export type MeshswapSinglePoolContract = GetContractReturnType; - -export class MeshswapSinglePool__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: meshswapSinglePoolAbi, publicClient: client }); - } -} diff --git a/src/apps/meshswap/contracts/viem/MeshswapSinglePoolFactory.ts b/src/apps/meshswap/contracts/viem/MeshswapSinglePoolFactory.ts deleted file mode 100644 index 6e2d2119c..000000000 --- a/src/apps/meshswap/contracts/viem/MeshswapSinglePoolFactory.ts +++ /dev/null @@ -1,994 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const meshswapSinglePoolFactoryAbi = [ - { - constant: false, - inputs: [ - { - name: 'newOperator', - type: 'address', - }, - ], - name: 'changeOperator', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'user', - type: 'address', - }, - { - name: 'amount', - type: 'uint256', - }, - ], - name: 'sendReward', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'token', - type: 'address', - }, - { - name: 'user', - type: 'address', - }, - { - name: 'insurance', - type: 'address', - }, - ], - name: 'transferDebt', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'newInterestRateModel', - type: 'address', - }, - ], - name: 'changeInterestRateModel', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'plusPoolFactory', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'nativeWithdrawer', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'token', - type: 'address', - }, - { - name: 'newReserveFactor', - type: 'uint256', - }, - ], - name: 'setPoolReserveFactor', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: 'idx', - type: 'uint256', - }, - ], - name: 'getPoolAddressByIndex', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'token', - type: 'address', - }, - { - name: 'user', - type: 'address', - }, - { - name: 'amount', - type: 'uint256', - }, - ], - name: 'repay', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: true, - stateMutability: 'payable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'token', - type: 'address', - }, - { - name: 'plusPoolAddress', - type: 'address', - }, - { - name: 'amount', - type: 'uint256', - }, - ], - name: 'repayInsurance', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: true, - stateMutability: 'payable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'getPlusPoolFactory', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: 'token', - type: 'address', - }, - { - name: 'user', - type: 'address', - }, - { - name: 'poolAddress', - type: 'address', - }, - ], - name: 'borrowBalanceInfo', - outputs: [ - { - name: '', - type: 'uint256', - }, - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'pools', - type: 'address[]', - }, - { - name: 'rate', - type: 'uint256[]', - }, - ], - name: 'changeMiningRate', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'token', - type: 'address', - }, - { - name: 'user', - type: 'address', - }, - { - name: 'poolAddress', - type: 'address', - }, - ], - name: 'borrowBalanceCurrent', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: '', - type: 'uint256', - }, - ], - name: 'singlePools', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'token', - type: 'address', - }, - { - name: 'user', - type: 'address', - }, - { - name: 'amount', - type: 'uint256', - }, - ], - name: 'borrow', - outputs: [ - { - name: '', - type: 'uint256', - }, - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: '', - type: 'address', - }, - ], - name: 'singlePoolVault', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'version', - outputs: [ - { - name: '', - type: 'string', - }, - ], - payable: false, - stateMutability: 'pure', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'totalMined', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'operator', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'governance', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'tokenAddress', - type: 'address', - }, - { - name: 'b', - type: 'bool', - }, - ], - name: 'setWithdrawActive', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: '_nextOwner', - type: 'address', - }, - ], - name: 'changeNextOwner', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [], - name: 'changeOwner', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'mining', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: '', - type: 'address', - }, - ], - name: 'singlePoolExist', - outputs: [ - { - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'nextOwner', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'getTotalMined', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'newNativeWithdrawer', - type: 'address', - }, - ], - name: 'changeNativeWithdrawer', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'owner', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'getPoolCount', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'token', - type: 'address', - }, - ], - name: 'createPool', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'newSinglePoolImpl', - type: 'address', - }, - ], - name: 'setSinglePoolImpl', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: 'token', - type: 'address', - }, - { - name: 'user', - type: 'address', - }, - { - name: 'poolAddress', - type: 'address', - }, - ], - name: 'borrowBalanceStored', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'entered', - outputs: [ - { - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'WETH', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'tokenAddress', - type: 'address', - }, - { - name: 'b', - type: 'bool', - }, - ], - name: 'setDepositActive', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'lastMined', - outputs: [ - { - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'admin', - type: 'address', - }, - { - name: 'token', - type: 'address', - }, - { - name: 'reduceAmount', - type: 'uint256', - }, - ], - name: 'reducePoolReserves', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'newPlusPoolFactory', - type: 'address', - }, - ], - name: 'setPlusPoolFactory', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'singlePoolImpl', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: 'tokenAddress', - type: 'address', - }, - { - name: 'newInterestRateModel', - type: 'address', - }, - ], - name: 'setPoolInterestRateModel', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - name: '_owner', - type: 'address', - }, - { - name: '_governance', - type: 'address', - }, - { - name: '_singlePoolImpl', - type: 'address', - }, - { - name: '_interestRateModel', - type: 'address', - }, - ], - name: '__SinglePoolFactory_init', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'interestRateModel', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'mesh', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [], - name: 'updateTotalMined', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [ - { - name: 'token', - type: 'address', - }, - ], - name: 'getPoolAddressByToken', - outputs: [ - { - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - payable: true, - stateMutability: 'payable', - type: 'fallback', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'nextOwner', - type: 'address', - }, - ], - name: 'ChangeNextOwner', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'owner', - type: 'address', - }, - ], - name: 'ChangeOwner', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'newOperator', - type: 'address', - }, - ], - name: 'ChangeOperator', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'newInterestRateModel', - type: 'address', - }, - ], - name: 'ChangeInterestRateModel', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'newNativeWithdrawer', - type: 'address', - }, - ], - name: 'ChangeNativeWithdrawer', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'token', - type: 'address', - }, - { - indexed: false, - name: 'pool', - type: 'address', - }, - { - indexed: false, - name: 'exid', - type: 'uint256', - }, - ], - name: 'CreatePool', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'poolAddress', - type: 'address', - }, - { - indexed: false, - name: 'b', - type: 'bool', - }, - ], - name: 'SetDepositActive', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'poolAddress', - type: 'address', - }, - { - indexed: false, - name: 'b', - type: 'bool', - }, - ], - name: 'SetWithdrawActive', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: 'pool', - type: 'address', - }, - { - indexed: false, - name: 'newInterestRateModel', - type: 'address', - }, - ], - name: 'SetPoolInterestRateModel', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: '_mining', - type: 'uint256', - }, - ], - name: 'ChangeMiningRate', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - name: '_lastMined', - type: 'uint256', - }, - { - indexed: false, - name: '_totalMined', - type: 'uint256', - }, - ], - name: 'UpdateLastMined', - type: 'event', - }, -] as const; - -export type MeshswapSinglePoolFactory = typeof meshswapSinglePoolFactoryAbi; -export type MeshswapSinglePoolFactoryContract = GetContractReturnType; - -export class MeshswapSinglePoolFactory__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: meshswapSinglePoolFactoryAbi, publicClient: client }); - } -} diff --git a/src/apps/meshswap/contracts/viem/index.ts b/src/apps/meshswap/contracts/viem/index.ts deleted file mode 100644 index d75940175..000000000 --- a/src/apps/meshswap/contracts/viem/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ - -export type { MeshswapSinglePoolFactory } from './MeshswapSinglePoolFactory'; -export type { MeshswapSinglePool } from './MeshswapSinglePool'; - -export { MeshswapSinglePoolFactory__factory } from './MeshswapSinglePoolFactory'; -export { MeshswapSinglePool__factory } from './MeshswapSinglePool'; diff --git a/src/apps/meshswap/meshswap.module.ts b/src/apps/meshswap/meshswap.module.ts deleted file mode 100644 index dce64cc53..000000000 --- a/src/apps/meshswap/meshswap.module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { AbstractApp } from '~app/app.dynamic-module'; -import { UniswapV2ViemContractFactory } from '~apps/uniswap-v2/contracts'; - -import { MeshswapViemContractFactory } from './contracts'; -import { PolygonMeshswapPoolTokenFetcher } from './polygon/meshswap.pool.token-fetcher'; -import { PolygonMeshswapSupplyTokenFetcher } from './polygon/meshswap.supply.token-fetcher'; - -@Module({ - providers: [ - MeshswapViemContractFactory, - UniswapV2ViemContractFactory, - PolygonMeshswapPoolTokenFetcher, - PolygonMeshswapSupplyTokenFetcher, - ], -}) -export class MeshswapAppModule extends AbstractApp() {} diff --git a/src/apps/meshswap/polygon/meshswap.pool.token-fetcher.ts b/src/apps/meshswap/polygon/meshswap.pool.token-fetcher.ts deleted file mode 100644 index 116be07ed..000000000 --- a/src/apps/meshswap/polygon/meshswap.pool.token-fetcher.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { UniswapV2DefaultPoolOnChainTemplateTokenFetcher } from '~apps/uniswap-v2/common/uniswap-v2.default.pool.on-chain.template.token-fetcher'; - -@PositionTemplate() -export class PolygonMeshswapPoolTokenFetcher extends UniswapV2DefaultPoolOnChainTemplateTokenFetcher { - groupLabel = 'Pools'; - factoryAddress = '0x9f3044f7f9fc8bc9ed615d54845b4577b833282d'; -} diff --git a/src/apps/meshswap/polygon/meshswap.supply.token-fetcher.ts b/src/apps/meshswap/polygon/meshswap.supply.token-fetcher.ts deleted file mode 100644 index b1dd7014a..000000000 --- a/src/apps/meshswap/polygon/meshswap.supply.token-fetcher.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { Inject } from '@nestjs/common'; -import _ from 'lodash'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetDataPropsParams, - GetDisplayPropsParams, - GetPricePerShareParams, - GetUnderlyingTokensParams, -} from '~position/template/app-token.template.types'; - -import { MeshswapViemContractFactory } from '../contracts'; -import { MeshswapSinglePool } from '../contracts/viem'; - -@PositionTemplate() -export class PolygonMeshswapSupplyTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Supply'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(MeshswapViemContractFactory) private readonly contractFactory: MeshswapViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.meshswapSinglePool({ network: this.network, address }); - } - - async getAddresses(): Promise { - const multicall = this.appToolkit.getViemMulticall(this.network); - const singlePoolFactoryContract = this.contractFactory.meshswapSinglePoolFactory({ - network: this.network, - address: '0x504722a6eabb3d1573bada9abd585ae177d52e7a', - }); - - const poolCountRaw = await multicall.wrap(singlePoolFactoryContract).read.getPoolCount(); - const poolCount = Number(poolCountRaw); - - const poolAddresses = await Promise.all( - _.range(0, poolCount).map(async index => { - return await multicall.wrap(singlePoolFactoryContract).read.getPoolAddressByIndex([BigInt(index)]); - }), - ); - return poolAddresses; - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.token(), network: this.network }]; - } - - async getPricePerShare({ contract }: GetPricePerShareParams): Promise { - const exchangeRateRaw = await contract.read.exchangeRateStored(); - const exchangeRate = Number(exchangeRateRaw) / 10 ** 18; - return [exchangeRate]; - } - - async getLabel({ contract }: GetDisplayPropsParams): Promise { - return contract.read.name(); - } - - async getLiquidity({ appToken, contract }: GetDataPropsParams) { - const cashRaw = await contract.read.getCash(); - const borrowAmountRaw = await contract.read.totalBorrows(); - const cash = Number(cashRaw) / 10 ** appToken.decimals; - const borrowAmount = Number(borrowAmountRaw) / 10 ** appToken.decimals; - - return borrowAmount + cash; - } -} diff --git a/src/apps/mux/arbitrum/mux.mux.token-fetcher.ts b/src/apps/mux/arbitrum/mux.mux.token-fetcher.ts deleted file mode 100644 index f1276d9c4..000000000 --- a/src/apps/mux/arbitrum/mux.mux.token-fetcher.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { getAppAssetImage } from '~app-toolkit/helpers/presentation/image.present'; -import { Erc20 } from '~contract/contracts/viem'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; - -import { MuxViemContractFactory } from '../contracts'; - -@PositionTemplate() -export class ArbitrumMuxMuxTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'MUX'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(MuxViemContractFactory) protected readonly contractFactory: MuxViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.appToolkit.globalViemContracts.erc20({ address, network: this.network }); - } - - async getAddresses() { - return ['0x8bb2ac0dcf1e86550534cee5e9c8ded4269b679b']; - } - - async getUnderlyingTokenDefinitions() { - return [{ address: '0x4e352cf164e64adcbad318c3a1e222e9eba4ce42', network: this.network }]; - } - - async getPricePerShare() { - return [1]; - } - - async getImages() { - return [getAppAssetImage('mux', 'MUX')]; - } -} diff --git a/src/apps/mux/mux.module.ts b/src/apps/mux/mux.module.ts index 646f41246..d51c6970f 100644 --- a/src/apps/mux/mux.module.ts +++ b/src/apps/mux/mux.module.ts @@ -7,7 +7,6 @@ import { OptimismMuxPerpContractPositionFetcher } from '~apps/mux/optimism/mux.p import { ArbitrumMuxFarmContractPositionFetcher } from './arbitrum/mux.farm.contract-position-fetcher'; import { ArbitrumMuxMlpTokenFetcher } from './arbitrum/mux.mlp.token-fetcher'; import { ArbitrumMuxMuxLpStakingContractPositionFetcher } from './arbitrum/mux.mux-lp-staking.contract-position-fetcher'; -import { ArbitrumMuxMuxTokenFetcher } from './arbitrum/mux.mux.token-fetcher'; import { ArbitrumMuxPerpContractPositionFetcher } from './arbitrum/mux.perp.contract-position-fetcher'; import { ArbitrumMuxVeMuxContractPositionFetcher } from './arbitrum/mux.ve-mux.contract-position-fetcher'; import { AvalancheMuxMlpTokenFetcher } from './avalanche/mux.mlp.token-fetcher'; @@ -25,7 +24,6 @@ import { FantomMuxPerpContractPositionFetcher } from './fantom/mux.perp.contract ArbitrumMuxFarmContractPositionFetcher, ArbitrumMuxPerpContractPositionFetcher, ArbitrumMuxMlpTokenFetcher, - ArbitrumMuxMuxTokenFetcher, ArbitrumMuxMuxLpStakingContractPositionFetcher, ArbitrumMuxVeMuxContractPositionFetcher, // Avalanche diff --git a/src/apps/olympus/contracts/abis/olympus-g-ohm-token.json b/src/apps/olympus/contracts/abis/olympus-g-ohm-token.json deleted file mode 100644 index 0f7e0627d..000000000 --- a/src/apps/olympus/contracts/abis/olympus-g-ohm-token.json +++ /dev/null @@ -1,269 +0,0 @@ -[ - { - "inputs": [ - { "internalType": "address", "name": "_migrator", "type": "address" }, - { "internalType": "address", "name": "_sOHM", "type": "address" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "delegator", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "fromDelegate", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "toDelegate", "type": "address" } - ], - "name": "DelegateChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "delegate", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "previousBalance", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "newBalance", "type": "uint256" } - ], - "name": "DelegateVotesChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "approved", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_amount", "type": "uint256" }], - "name": "balanceFrom", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_amount", "type": "uint256" }], - "name": "balanceTo", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_from", "type": "address" }, - { "internalType": "uint256", "name": "_amount", "type": "uint256" } - ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "uint256", "name": "", "type": "uint256" } - ], - "name": "checkpoints", - "outputs": [ - { "internalType": "uint256", "name": "fromBlock", "type": "uint256" }, - { "internalType": "uint256", "name": "votes", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "subtractedValue", "type": "uint256" } - ], - "name": "decreaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "delegatee", "type": "address" }], - "name": "delegate", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "delegates", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], - "name": "getCurrentVotes", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "account", "type": "address" }, - { "internalType": "uint256", "name": "blockNumber", "type": "uint256" } - ], - "name": "getPriorVotes", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "addedValue", "type": "uint256" } - ], - "name": "increaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "index", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_staking", "type": "address" }, - { "internalType": "address", "name": "_sOHM", "type": "address" } - ], - "name": "migrate", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "migrated", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_to", "type": "address" }, - { "internalType": "uint256", "name": "_amount", "type": "uint256" } - ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "numCheckpoints", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "sOHM", - "outputs": [{ "internalType": "contract IsOHM", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/olympus/contracts/abis/olympus-s-ohm-token.json b/src/apps/olympus/contracts/abis/olympus-s-ohm-token.json deleted file mode 100644 index c46b3a7aa..000000000 --- a/src/apps/olympus/contracts/abis/olympus-s-ohm-token.json +++ /dev/null @@ -1,303 +0,0 @@ -[ - { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "rebase", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "index", "type": "uint256" } - ], - "name": "LogRebase", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "stakingContract", "type": "address" }], - "name": "LogStakingContractUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "totalSupply", "type": "uint256" } - ], - "name": "LogSupply", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [], - "name": "DOMAIN_SEPARATOR", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner_", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "gons", "type": "uint256" }], - "name": "balanceForGons", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "who", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "amount", "type": "uint256" }, - { "internalType": "address", "name": "debtor", "type": "address" }, - { "internalType": "bool", "name": "add", "type": "bool" } - ], - "name": "changeDebt", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "circulatingSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "debtBalances", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "subtractedValue", "type": "uint256" } - ], - "name": "decreaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "fromG", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "gOHM", - "outputs": [{ "internalType": "contract IgOHM", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "gonsForBalance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "addedValue", "type": "uint256" } - ], - "name": "increaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "index", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_stakingContract", "type": "address" }, - { "internalType": "address", "name": "_treasury", "type": "address" } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], - "name": "nonces", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" }, - { "internalType": "uint256", "name": "deadline", "type": "uint256" }, - { "internalType": "uint8", "name": "v", "type": "uint8" }, - { "internalType": "bytes32", "name": "r", "type": "bytes32" }, - { "internalType": "bytes32", "name": "s", "type": "bytes32" } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "profit_", "type": "uint256" }, - { "internalType": "uint256", "name": "epoch_", "type": "uint256" } - ], - "name": "rebase", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "name": "rebases", - "outputs": [ - { "internalType": "uint256", "name": "epoch", "type": "uint256" }, - { "internalType": "uint256", "name": "rebase", "type": "uint256" }, - { "internalType": "uint256", "name": "totalStakedBefore", "type": "uint256" }, - { "internalType": "uint256", "name": "totalStakedAfter", "type": "uint256" }, - { "internalType": "uint256", "name": "amountRebased", "type": "uint256" }, - { "internalType": "uint256", "name": "index", "type": "uint256" }, - { "internalType": "uint256", "name": "blockNumberOccured", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_index", "type": "uint256" }], - "name": "setIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_gOHM", "type": "address" }], - "name": "setgOHM", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "stakingContract", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "toG", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "treasury", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - } -] diff --git a/src/apps/olympus/contracts/abis/olympus-s-ohm-v-1-token.json b/src/apps/olympus/contracts/abis/olympus-s-ohm-v-1-token.json deleted file mode 100644 index 4ecbf5cd0..000000000 --- a/src/apps/olympus/contracts/abis/olympus-s-ohm-v-1-token.json +++ /dev/null @@ -1,303 +0,0 @@ -[ - { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "rebase", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "index", "type": "uint256" } - ], - "name": "LogRebase", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "stakingContract", "type": "address" }], - "name": "LogStakingContractUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "timestamp", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "totalSupply", "type": "uint256" } - ], - "name": "LogSupply", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } - ], - "name": "OwnershipPulled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } - ], - "name": "OwnershipPushed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [], - "name": "DOMAIN_SEPARATOR", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "INDEX", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PERMIT_TYPEHASH", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner_", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "gons", "type": "uint256" }], - "name": "balanceForGons", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "who", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "circulatingSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "subtractedValue", "type": "uint256" } - ], - "name": "decreaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "gonsForBalance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "addedValue", "type": "uint256" } - ], - "name": "increaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "index", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "stakingContract_", "type": "address" }], - "name": "initialize", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "initializer", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "manager", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], - "name": "nonces", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" }, - { "internalType": "uint256", "name": "deadline", "type": "uint256" }, - { "internalType": "uint8", "name": "v", "type": "uint8" }, - { "internalType": "bytes32", "name": "r", "type": "bytes32" }, - { "internalType": "bytes32", "name": "s", "type": "bytes32" } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { "inputs": [], "name": "pullManagement", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [{ "internalType": "address", "name": "newOwner_", "type": "address" }], - "name": "pushManagement", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "profit_", "type": "uint256" }, - { "internalType": "uint256", "name": "epoch_", "type": "uint256" } - ], - "name": "rebase", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "name": "rebases", - "outputs": [ - { "internalType": "uint256", "name": "epoch", "type": "uint256" }, - { "internalType": "uint256", "name": "rebase", "type": "uint256" }, - { "internalType": "uint256", "name": "totalStakedBefore", "type": "uint256" }, - { "internalType": "uint256", "name": "totalStakedAfter", "type": "uint256" }, - { "internalType": "uint256", "name": "amountRebased", "type": "uint256" }, - { "internalType": "uint256", "name": "index", "type": "uint256" }, - { "internalType": "uint256", "name": "blockNumberOccured", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function" - }, - { "inputs": [], "name": "renounceManagement", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [{ "internalType": "uint256", "name": "_INDEX", "type": "uint256" }], - "name": "setIndex", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "stakingContract", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/olympus/contracts/abis/olympus-ws-ohm-v-1-token.json b/src/apps/olympus/contracts/abis/olympus-ws-ohm-v-1-token.json deleted file mode 100644 index cc4447899..000000000 --- a/src/apps/olympus/contracts/abis/olympus-ws-ohm-v-1-token.json +++ /dev/null @@ -1,158 +0,0 @@ -[ - { - "inputs": [{ "internalType": "address", "name": "_sOHM", "type": "address" }], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "subtractedValue", "type": "uint256" } - ], - "name": "decreaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "addedValue", "type": "uint256" } - ], - "name": "increaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "sOHM", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_amount", "type": "uint256" }], - "name": "sOHMTowOHM", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_amount", "type": "uint256" }], - "name": "unwrap", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_amount", "type": "uint256" }], - "name": "wOHMTosOHM", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_amount", "type": "uint256" }], - "name": "wrap", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/olympus/contracts/viem.contract-factory.ts b/src/apps/olympus/contracts/viem.contract-factory.ts index ed57226f1..bad36039b 100644 --- a/src/apps/olympus/contracts/viem.contract-factory.ts +++ b/src/apps/olympus/contracts/viem.contract-factory.ts @@ -5,13 +5,9 @@ import { Network } from '~types/network.interface'; import { OlympusBoostedLiquidityManager__factory, - OlympusGOhmToken__factory, OlympusLiquidityRegistry__factory, - OlympusSOhmToken__factory, - OlympusSOhmV1Token__factory, OlympusV1BondDepository__factory, OlympusV2BondDepository__factory, - OlympusWsOhmV1Token__factory, OlympusZapperZap__factory, } from './viem'; @@ -24,27 +20,15 @@ export class OlympusViemContractFactory { olympusBoostedLiquidityManager({ address, network }: ContractOpts) { return OlympusBoostedLiquidityManager__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } - olympusGOhmToken({ address, network }: ContractOpts) { - return OlympusGOhmToken__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } olympusLiquidityRegistry({ address, network }: ContractOpts) { return OlympusLiquidityRegistry__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } - olympusSOhmToken({ address, network }: ContractOpts) { - return OlympusSOhmToken__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - olympusSOhmV1Token({ address, network }: ContractOpts) { - return OlympusSOhmV1Token__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } olympusV1BondDepository({ address, network }: ContractOpts) { return OlympusV1BondDepository__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } olympusV2BondDepository({ address, network }: ContractOpts) { return OlympusV2BondDepository__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } - olympusWsOhmV1Token({ address, network }: ContractOpts) { - return OlympusWsOhmV1Token__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } olympusZapperZap({ address, network }: ContractOpts) { return OlympusZapperZap__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } diff --git a/src/apps/olympus/contracts/viem/OlympusGOhmToken.ts b/src/apps/olympus/contracts/viem/OlympusGOhmToken.ts deleted file mode 100644 index 7df107e2a..000000000 --- a/src/apps/olympus/contracts/viem/OlympusGOhmToken.ts +++ /dev/null @@ -1,619 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const olympusGOhmTokenAbi = [ - { - inputs: [ - { - internalType: 'address', - name: '_migrator', - type: 'address', - }, - { - internalType: 'address', - name: '_sOHM', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'delegator', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'fromDelegate', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'toDelegate', - type: 'address', - }, - ], - name: 'DelegateChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'delegate', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'previousBalance', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'newBalance', - type: 'uint256', - }, - ], - name: 'DelegateVotesChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'approved', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'balanceFrom', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'balanceTo', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_from', - type: 'address', - }, - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'burn', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'checkpoints', - outputs: [ - { - internalType: 'uint256', - name: 'fromBlock', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'votes', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'subtractedValue', - type: 'uint256', - }, - ], - name: 'decreaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'delegatee', - type: 'address', - }, - ], - name: 'delegate', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'delegates', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'getCurrentVotes', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - { - internalType: 'uint256', - name: 'blockNumber', - type: 'uint256', - }, - ], - name: 'getPriorVotes', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'addedValue', - type: 'uint256', - }, - ], - name: 'increaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'index', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_staking', - type: 'address', - }, - { - internalType: 'address', - name: '_sOHM', - type: 'address', - }, - ], - name: 'migrate', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'migrated', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_to', - type: 'address', - }, - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'mint', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'numCheckpoints', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'sOHM', - outputs: [ - { - internalType: 'contract IsOHM', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type OlympusGOhmToken = typeof olympusGOhmTokenAbi; -export type OlympusGOhmTokenContract = GetContractReturnType; - -export class OlympusGOhmToken__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: olympusGOhmTokenAbi, publicClient: client }); - } -} diff --git a/src/apps/olympus/contracts/viem/OlympusSOhmToken.ts b/src/apps/olympus/contracts/viem/OlympusSOhmToken.ts deleted file mode 100644 index 3e26193ec..000000000 --- a/src/apps/olympus/contracts/viem/OlympusSOhmToken.ts +++ /dev/null @@ -1,723 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const olympusSOhmTokenAbi = [ - { - inputs: [], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'rebase', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - ], - name: 'LogRebase', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'stakingContract', - type: 'address', - }, - ], - name: 'LogStakingContractUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'totalSupply', - type: 'uint256', - }, - ], - name: 'LogSupply', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - inputs: [], - name: 'DOMAIN_SEPARATOR', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner_', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'gons', - type: 'uint256', - }, - ], - name: 'balanceForGons', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'who', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'address', - name: 'debtor', - type: 'address', - }, - { - internalType: 'bool', - name: 'add', - type: 'bool', - }, - ], - name: 'changeDebt', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'circulatingSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'debtBalances', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'subtractedValue', - type: 'uint256', - }, - ], - name: 'decreaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'fromG', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'gOHM', - outputs: [ - { - internalType: 'contract IgOHM', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'gonsForBalance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'addedValue', - type: 'uint256', - }, - ], - name: 'increaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'index', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_stakingContract', - type: 'address', - }, - { - internalType: 'address', - name: '_treasury', - type: 'address', - }, - ], - name: 'initialize', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'nonces', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - ], - name: 'permit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'profit_', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'epoch_', - type: 'uint256', - }, - ], - name: 'rebase', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'rebases', - outputs: [ - { - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'rebase', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalStakedBefore', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalStakedAfter', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'amountRebased', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'blockNumberOccured', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_index', - type: 'uint256', - }, - ], - name: 'setIndex', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_gOHM', - type: 'address', - }, - ], - name: 'setgOHM', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'stakingContract', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'toG', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'treasury', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, -] as const; - -export type OlympusSOhmToken = typeof olympusSOhmTokenAbi; -export type OlympusSOhmTokenContract = GetContractReturnType; - -export class OlympusSOhmToken__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: olympusSOhmTokenAbi, publicClient: client }); - } -} diff --git a/src/apps/olympus/contracts/viem/OlympusSOhmV1Token.ts b/src/apps/olympus/contracts/viem/OlympusSOhmV1Token.ts deleted file mode 100644 index 5387583a6..000000000 --- a/src/apps/olympus/contracts/viem/OlympusSOhmV1Token.ts +++ /dev/null @@ -1,734 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const olympusSOhmV1TokenAbi = [ - { - inputs: [], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'rebase', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - ], - name: 'LogRebase', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'stakingContract', - type: 'address', - }, - ], - name: 'LogStakingContractUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'timestamp', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'totalSupply', - type: 'uint256', - }, - ], - name: 'LogSupply', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'previousOwner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnershipPulled', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'previousOwner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnershipPushed', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - inputs: [], - name: 'DOMAIN_SEPARATOR', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'INDEX', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'PERMIT_TYPEHASH', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner_', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'gons', - type: 'uint256', - }, - ], - name: 'balanceForGons', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'who', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'circulatingSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'subtractedValue', - type: 'uint256', - }, - ], - name: 'decreaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'gonsForBalance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'addedValue', - type: 'uint256', - }, - ], - name: 'increaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'index', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'stakingContract_', - type: 'address', - }, - ], - name: 'initialize', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'initializer', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'manager', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'nonces', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - ], - name: 'permit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'pullManagement', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newOwner_', - type: 'address', - }, - ], - name: 'pushManagement', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'profit_', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'epoch_', - type: 'uint256', - }, - ], - name: 'rebase', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'rebases', - outputs: [ - { - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'rebase', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalStakedBefore', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalStakedAfter', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'amountRebased', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'blockNumberOccured', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'renounceManagement', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_INDEX', - type: 'uint256', - }, - ], - name: 'setIndex', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'stakingContract', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type OlympusSOhmV1Token = typeof olympusSOhmV1TokenAbi; -export type OlympusSOhmV1TokenContract = GetContractReturnType; - -export class OlympusSOhmV1Token__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: olympusSOhmV1TokenAbi, publicClient: client }); - } -} diff --git a/src/apps/olympus/contracts/viem/OlympusWsOhmV1Token.ts b/src/apps/olympus/contracts/viem/OlympusWsOhmV1Token.ts deleted file mode 100644 index 18aba1b41..000000000 --- a/src/apps/olympus/contracts/viem/OlympusWsOhmV1Token.ts +++ /dev/null @@ -1,386 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const olympusWsOhmV1TokenAbi = [ - { - inputs: [ - { - internalType: 'address', - name: '_sOHM', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'subtractedValue', - type: 'uint256', - }, - ], - name: 'decreaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'addedValue', - type: 'uint256', - }, - ], - name: 'increaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'sOHM', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'sOHMTowOHM', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'unwrap', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'wOHMTosOHM', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'wrap', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type OlympusWsOhmV1Token = typeof olympusWsOhmV1TokenAbi; -export type OlympusWsOhmV1TokenContract = GetContractReturnType; - -export class OlympusWsOhmV1Token__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: olympusWsOhmV1TokenAbi, publicClient: client }); - } -} diff --git a/src/apps/olympus/contracts/viem/index.ts b/src/apps/olympus/contracts/viem/index.ts index 66e7ad4c4..af70b36df 100644 --- a/src/apps/olympus/contracts/viem/index.ts +++ b/src/apps/olympus/contracts/viem/index.ts @@ -3,21 +3,13 @@ /* eslint-disable */ export type { OlympusBoostedLiquidityManager } from './OlympusBoostedLiquidityManager'; -export type { OlympusGOhmToken } from './OlympusGOhmToken'; export type { OlympusLiquidityRegistry } from './OlympusLiquidityRegistry'; -export type { OlympusSOhmToken } from './OlympusSOhmToken'; -export type { OlympusSOhmV1Token } from './OlympusSOhmV1Token'; export type { OlympusV1BondDepository } from './OlympusV1BondDepository'; export type { OlympusV2BondDepository } from './OlympusV2BondDepository'; -export type { OlympusWsOhmV1Token } from './OlympusWsOhmV1Token'; export type { OlympusZapperZap } from './OlympusZapperZap'; export { OlympusBoostedLiquidityManager__factory } from './OlympusBoostedLiquidityManager'; -export { OlympusGOhmToken__factory } from './OlympusGOhmToken'; export { OlympusLiquidityRegistry__factory } from './OlympusLiquidityRegistry'; -export { OlympusSOhmToken__factory } from './OlympusSOhmToken'; -export { OlympusSOhmV1Token__factory } from './OlympusSOhmV1Token'; export { OlympusV1BondDepository__factory } from './OlympusV1BondDepository'; export { OlympusV2BondDepository__factory } from './OlympusV2BondDepository'; -export { OlympusWsOhmV1Token__factory } from './OlympusWsOhmV1Token'; export { OlympusZapperZap__factory } from './OlympusZapperZap'; diff --git a/src/apps/olympus/ethereum/olympus.g-ohm.token-fetcher.ts b/src/apps/olympus/ethereum/olympus.g-ohm.token-fetcher.ts deleted file mode 100644 index b3ded3be6..000000000 --- a/src/apps/olympus/ethereum/olympus.g-ohm.token-fetcher.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Inject } from '@nestjs/common'; -import { BigNumber } from 'ethers'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetDataPropsParams, - GetPricePerShareParams, - GetUnderlyingTokensParams, -} from '~position/template/app-token.template.types'; - -import { OlympusViemContractFactory } from '../contracts'; -import { OlympusGOhmToken } from '../contracts/viem'; - -@PositionTemplate() -export class EthereumOlympusGOhmTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'gOHM'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(OlympusViemContractFactory) protected readonly contractFactory: OlympusViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.olympusGOhmToken({ address, network: this.network }); - } - - async getAddresses() { - return ['0x0ab87046fbb341d058f17cbc4c1133f25a20a52f']; - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.sOHM(), network: this.network }]; - } - - async getPricePerShare({ contract, appToken }: GetPricePerShareParams) { - const oneOhm = BigNumber.from(1).mul(10).pow(appToken.tokens[0].decimals).toString(); - const [gOhmDecimalsRaw, gOhmConvertedAmountRaw] = await Promise.all([ - contract.read.decimals(), - contract.read.balanceTo([BigInt(oneOhm)]), - ]); - - const convertedAmount = Number(gOhmConvertedAmountRaw) / 10 ** gOhmDecimalsRaw; - const pricePerShare = 1 / convertedAmount; - return [pricePerShare]; - } - - async getLiquidity({ appToken, multicall }: GetDataPropsParams) { - const underlyingToken = appToken.tokens[0]; - const reserveAddress = '0xb63cac384247597756545b500253ff8e607a8020'; - const underlyingTokenContract = this.appToolkit.globalViemContracts.erc20({ - address: underlyingToken.address, - network: this.network, - }); - - const reserveRaw = await multicall.wrap(underlyingTokenContract).read.balanceOf([reserveAddress]); - const reserve = Number(reserveRaw) / 10 ** underlyingToken.decimals; - return reserve * underlyingToken.price; - } - - async getReserves({ appToken, multicall }: GetDataPropsParams) { - const underlyingToken = appToken.tokens[0]; - const reserveAddress = '0xb63cac384247597756545b500253ff8e607a8020'; - const underlyingTokenContract = this.appToolkit.globalViemContracts.erc20({ - address: underlyingToken.address, - network: this.network, - }); - - const reserveRaw = await multicall.wrap(underlyingTokenContract).read.balanceOf([reserveAddress]); - return [Number(reserveRaw) / 10 ** underlyingToken.decimals]; - } - - async getApy() { - return 0; - } -} diff --git a/src/apps/olympus/ethereum/olympus.s-ohm-v1.token-fetcher.ts b/src/apps/olympus/ethereum/olympus.s-ohm-v1.token-fetcher.ts deleted file mode 100644 index e3a2092a4..000000000 --- a/src/apps/olympus/ethereum/olympus.s-ohm-v1.token-fetcher.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetDataPropsParams } from '~position/template/app-token.template.types'; - -import { OlympusViemContractFactory } from '../contracts'; -import { OlympusSOhmV1Token } from '../contracts/viem'; - -@PositionTemplate() -export class EthereumOlympusSOhmV1TokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'sOHM v1'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(OlympusViemContractFactory) protected readonly contractFactory: OlympusViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.olympusSOhmV1Token({ address, network: this.network }); - } - - async getAddresses() { - return ['0x04f2694c8fcee23e8fd0dfea1d4f5bb8c352111f']; - } - - async getUnderlyingTokenDefinitions() { - return [{ address: '0x383518188c0c6d7730d91b2c03a03c837814a899', network: this.network }]; - } - - async getPricePerShare() { - return [1]; - } - - async getLiquidity({ appToken, multicall }: GetDataPropsParams) { - const underlyingToken = appToken.tokens[0]; - const reserveAddress = '0xfd31c7d00ca47653c6ce64af53c1571f9c36566a'; - const underlyingTokenContract = this.appToolkit.globalViemContracts.erc20({ - address: underlyingToken.address, - network: this.network, - }); - - const reserveRaw = await multicall.wrap(underlyingTokenContract).read.balanceOf([reserveAddress]); - const reserve = Number(reserveRaw) / 10 ** underlyingToken.decimals; - return reserve * underlyingToken.price; - } - - async getReserves({ appToken, multicall }: GetDataPropsParams) { - const underlyingToken = appToken.tokens[0]; - const reserveAddress = '0xfd31c7d00ca47653c6ce64af53c1571f9c36566a'; - const underlyingTokenContract = this.appToolkit.globalViemContracts.erc20({ - address: underlyingToken.address, - network: this.network, - }); - - const reserveRaw = await multicall.wrap(underlyingTokenContract).read.balanceOf([reserveAddress]); - return [Number(reserveRaw) / 10 ** underlyingToken.decimals]; - } -} diff --git a/src/apps/olympus/ethereum/olympus.s-ohm.token-fetcher.ts b/src/apps/olympus/ethereum/olympus.s-ohm.token-fetcher.ts deleted file mode 100644 index 650199a30..000000000 --- a/src/apps/olympus/ethereum/olympus.s-ohm.token-fetcher.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetDataPropsParams } from '~position/template/app-token.template.types'; - -import { OlympusViemContractFactory } from '../contracts'; -import { OlympusSOhmToken } from '../contracts/viem'; - -@PositionTemplate() -export class EthereumOlympusSOhmTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'sOHM v2'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(OlympusViemContractFactory) protected readonly contractFactory: OlympusViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.olympusSOhmToken({ address, network: this.network }); - } - - async getAddresses() { - return ['0x04906695d6d12cf5459975d7c3c03356e4ccd460']; - } - - async getUnderlyingTokenDefinitions() { - return [{ address: '0x64aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d5', network: this.network }]; - } - - async getPricePerShare() { - return [1]; - } - - async getLiquidity({ appToken, multicall }: GetDataPropsParams) { - const underlyingToken = appToken.tokens[0]; - const reserveAddress = '0xb63cac384247597756545b500253ff8e607a8020'; - const underlyingTokenContract = this.appToolkit.globalViemContracts.erc20({ - address: underlyingToken.address, - network: this.network, - }); - - const reserveRaw = await multicall.wrap(underlyingTokenContract).read.balanceOf([reserveAddress]); - const reserve = Number(reserveRaw) / 10 ** underlyingToken.decimals; - return reserve * underlyingToken.price; - } - - async getReserves({ appToken, multicall }: GetDataPropsParams) { - const underlyingToken = appToken.tokens[0]; - const reserveAddress = '0xb63cac384247597756545b500253ff8e607a8020'; - const underlyingTokenContract = this.appToolkit.globalViemContracts.erc20({ - address: underlyingToken.address, - network: this.network, - }); - - const reserveRaw = await multicall.wrap(underlyingTokenContract).read.balanceOf([reserveAddress]); - return [Number(reserveRaw) / 10 ** underlyingToken.decimals]; - } -} diff --git a/src/apps/olympus/ethereum/olympus.ws-ohm-v1.token-fetcher.ts b/src/apps/olympus/ethereum/olympus.ws-ohm-v1.token-fetcher.ts deleted file mode 100644 index 5a1565f71..000000000 --- a/src/apps/olympus/ethereum/olympus.ws-ohm-v1.token-fetcher.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetPricePerShareParams, GetUnderlyingTokensParams } from '~position/template/app-token.template.types'; - -import { OlympusViemContractFactory } from '../contracts'; -import { OlympusWsOhmV1Token } from '../contracts/viem'; - -@PositionTemplate() -export class EthereumOlympusWsOhmV1TokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'wsOHM v1'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(OlympusViemContractFactory) protected readonly contractFactory: OlympusViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.olympusWsOhmV1Token({ address, network: this.network }); - } - - async getAddresses() { - return ['0xca76543cf381ebbb277be79574059e32108e3e65']; - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.sOHM(), network: this.network }]; - } - - async getPricePerShare({ appToken, multicall }: GetPricePerShareParams) { - const reserveRaw = await multicall - .wrap(this.appToolkit.globalViemContracts.erc20(appToken.tokens[0])) - .read.balanceOf([appToken.address]); - const reserve = Number(reserveRaw) / 10 ** appToken.tokens[0].decimals; - const pricePerShare = reserve / appToken.supply; - return [pricePerShare]; - } -} diff --git a/src/apps/olympus/olympus.module.ts b/src/apps/olympus/olympus.module.ts index 9519c9510..a30bad482 100644 --- a/src/apps/olympus/olympus.module.ts +++ b/src/apps/olympus/olympus.module.ts @@ -9,10 +9,6 @@ import { AvalancheOlympusWsOhmV1TokenFetcher } from './avalanche/olympus.ws-ohm- import { OlympusViemContractFactory } from './contracts'; import { EthereumOlympusBondContractPositionFetcher } from './ethereum/olympus.bond.contract-position-fetcher'; import { EthereumOlympusBleContractPositionFetcher } from './ethereum/olympus.boosted-liquidity.contract-position-fetcher'; -import { EthereumOlympusGOhmTokenFetcher } from './ethereum/olympus.g-ohm.token-fetcher'; -import { EthereumOlympusSOhmV1TokenFetcher } from './ethereum/olympus.s-ohm-v1.token-fetcher'; -import { EthereumOlympusSOhmTokenFetcher } from './ethereum/olympus.s-ohm.token-fetcher'; -import { EthereumOlympusWsOhmV1TokenFetcher } from './ethereum/olympus.ws-ohm-v1.token-fetcher'; import { FantomOlympusGOhmTokenFetcher } from './fantom/olympus.g-ohm.token-fetcher'; import { PolygonOlympusGOhmTokenFetcher } from './polygon/olympus.g-ohm.token-fetcher'; @@ -24,10 +20,6 @@ import { PolygonOlympusGOhmTokenFetcher } from './polygon/olympus.g-ohm.token-fe AvalancheOlympusWsOhmV1TokenFetcher, EthereumOlympusBleContractPositionFetcher, EthereumOlympusBondContractPositionFetcher, - EthereumOlympusGOhmTokenFetcher, - EthereumOlympusSOhmTokenFetcher, - EthereumOlympusSOhmV1TokenFetcher, - EthereumOlympusWsOhmV1TokenFetcher, FantomOlympusGOhmTokenFetcher, OlympusViemContractFactory, PolygonOlympusGOhmTokenFetcher, diff --git a/src/apps/ooki/arbitrum/ooki.lend.token-fetcher.ts b/src/apps/ooki/arbitrum/ooki.lend.token-fetcher.ts deleted file mode 100644 index 0d89137c4..000000000 --- a/src/apps/ooki/arbitrum/ooki.lend.token-fetcher.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetPricePerShareParams, GetUnderlyingTokensParams } from '~position/template/app-token.template.types'; - -import { OokiViemContractFactory } from '../contracts'; -import { OokiIToken } from '../contracts/viem'; - -@PositionTemplate() -export class ArbitrumOokiLendTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Lending'; - - tokenRegistryAddress = '0x86003099131d83944d826f8016e09cc678789a30'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(OokiViemContractFactory) protected readonly contractFactory: OokiViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.ookiIToken({ address, network: this.network }); - } - - async getAddresses(): Promise { - const registryContract = this.contractFactory.ookiTokenRegistry({ - network: this.network, - address: this.tokenRegistryAddress, - }); - - const tokenAddresses = await registryContract.read.getTokens([BigInt(0), BigInt(100)]); - return tokenAddresses.map(v => v.token); - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.loanTokenAddress(), network: this.network }]; - } - - async getPricePerShare({ contract }: GetPricePerShareParams) { - const exchangeRateRaw = await contract.read.tokenPrice(); - const exchangeRate = Number(exchangeRateRaw) / 10 ** 18; - return [exchangeRate]; - } -} diff --git a/src/apps/ooki/assets/logo.png b/src/apps/ooki/assets/logo.png deleted file mode 100644 index b1156a595f89ab5ff9997d8a1de3d9e42c288505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305833 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⩔x1}uXx)#3een-3LHhrfcYtE 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 t#!`Sm(PvR)On8XK=f^~US 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 { - groupLabel = 'Lending'; - - tokenRegistryAddress = '0x1be70f29d30bb1d325e5d76ee73109de3e50a57d'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(OokiViemContractFactory) protected readonly contractFactory: OokiViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.ookiIToken({ address, network: this.network }); - } - - async getAddresses(): Promise { - const registryContract = this.contractFactory.ookiTokenRegistry({ - network: this.network, - address: this.tokenRegistryAddress, - }); - - const tokenAddresses = await registryContract.read.getTokens([BigInt(0), BigInt(100)]); - return tokenAddresses.map(v => v.token); - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.loanTokenAddress(), network: this.network }]; - } - - async getPricePerShare({ contract }: GetPricePerShareParams) { - const exchangeRateRaw = await contract.read.tokenPrice(); - const exchangeRate = Number(exchangeRateRaw) / 10 ** 18; - return [exchangeRate]; - } -} diff --git a/src/apps/ooki/contracts/abis/ooki-i-token.json b/src/apps/ooki/contracts/abis/ooki-i-token.json deleted file mode 100644 index 94bd1f56b..000000000 --- a/src/apps/ooki/contracts/abis/ooki-i-token.json +++ /dev/null @@ -1,956 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "burner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "tokenAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "assetAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "price", - "type": "uint256" - } - ], - "name": "Burn", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "borrower", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "loanToken", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "loanAmount", - "type": "uint256" - } - ], - "name": "FlashBorrow", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "minter", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "tokenAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "assetAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "price", - "type": "uint256" - } - ], - "name": "Mint", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "sig", - "type": "bytes4" - } - ], - "name": "_isPaused", - "outputs": [ - { - "internalType": "bool", - "name": "isPaused", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_owner", - "type": "address" - } - ], - "name": "assetBalanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "loanId", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "withdrawAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "initialLoanDuration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "collateralTokenSent", - "type": "uint256" - }, - { - "internalType": "address", - "name": "collateralTokenAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "borrower", - "type": "address" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "name": "borrow", - "outputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "loanId", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "principal", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "collateral", - "type": "uint256" - } - ], - "internalType": "struct IToken.LoanOpenData", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "borrowInterestRate", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "uint256", - "name": "burnAmount", - "type": "uint256" - } - ], - "name": "burn", - "outputs": [ - { - "internalType": "uint256", - "name": "loanAmountPaid", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address payable", - "name": "receiver", - "type": "address" - }, - { - "internalType": "uint256", - "name": "burnAmount", - "type": "uint256" - } - ], - "name": "burnToEther", - "outputs": [ - { - "internalType": "uint256", - "name": "loanAmountPaid", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newGuardian", - "type": "address" - } - ], - "name": "changeGuardian", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_user", - "type": "address" - } - ], - "name": "checkpointPrice", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "borrowAmount", - "type": "uint256" - }, - { - "internalType": "address", - "name": "borrower", - "type": "address" - }, - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "string", - "name": "signature", - "type": "string" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "flashBorrow", - "outputs": [ - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "getGuardian", - "outputs": [ - { - "internalType": "address", - "name": "guardian", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getPoolUtilization", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "initialPrice", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "loanParamsIds", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "loanTokenAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "loanId", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "leverageAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "loanTokenSent", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "collateralTokenSent", - "type": "uint256" - }, - { - "internalType": "address", - "name": "collateralTokenAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "trader", - "type": "address" - }, - { - "internalType": "bytes", - "name": "loanDataBytes", - "type": "bytes" - } - ], - "name": "marginTrade", - "outputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "loanId", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "principal", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "collateral", - "type": "uint256" - } - ], - "internalType": "struct IToken.LoanOpenData", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "uint256", - "name": "depositAmount", - "type": "uint256" - } - ], - "name": "mint", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "mintWithEther", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "borrowAmount", - "type": "uint256" - } - ], - "name": "nextBorrowInterestRate", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "int256", - "name": "supplyAmount", - "type": "int256" - } - ], - "name": "nextSupplyInterestRate", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "user", - "type": "address" - } - ], - "name": "profitOf", - "outputs": [ - { - "internalType": "int256", - "name": "", - "type": "int256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_loanTokenAddress", - "type": "address" - } - ], - "name": "revokeApproval", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_newTarget", - "type": "address" - } - ], - "name": "setTarget", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "supplyInterestRate", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "sig", - "type": "bytes4" - } - ], - "name": "toggleFunctionPause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "sig", - "type": "bytes4" - } - ], - "name": "toggleFunctionUnPause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "tokenPrice", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalAssetBorrow", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalAssetSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assetSupply", - "type": "uint256" - } - ], - "name": "totalSupplyInterestRate", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "newFeePercent", - "type": "uint256" - } - ], - "name": "updateFlashBorrowFeePercent", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "settingsTarget", - "type": "address" - }, - { - "internalType": "bytes", - "name": "callData", - "type": "bytes" - } - ], - "name": "updateSettings", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/ooki/contracts/abis/ooki-token-registry.json b/src/apps/ooki/contracts/abis/ooki-token-registry.json deleted file mode 100644 index 1c8681f3f..000000000 --- a/src/apps/ooki/contracts/abis/ooki-token-registry.json +++ /dev/null @@ -1,55 +0,0 @@ -[ - { - "constant": true, - "inputs": [], - "name": "bZxContract", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "_start", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_count", - "type": "uint256" - } - ], - "name": "getTokens", - "outputs": [ - { - "components": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "address", - "name": "asset", - "type": "address" - } - ], - "internalType": "struct TokenRegistry.TokenMetadata[]", - "name": "metadata", - "type": "tuple[]" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - } -] diff --git a/src/apps/ooki/contracts/index.ts b/src/apps/ooki/contracts/index.ts deleted file mode 100644 index 5dcfebdf6..000000000 --- a/src/apps/ooki/contracts/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -export * from './viem.contract-factory'; diff --git a/src/apps/ooki/contracts/viem.contract-factory.ts b/src/apps/ooki/contracts/viem.contract-factory.ts deleted file mode 100644 index bb10ba553..000000000 --- a/src/apps/ooki/contracts/viem.contract-factory.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Injectable, Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { Network } from '~types/network.interface'; - -import { OokiIToken__factory, OokiTokenRegistry__factory } from './viem'; - -type ContractOpts = { address: string; network: Network }; - -@Injectable() -export class OokiViemContractFactory { - constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) {} - - ookiIToken({ address, network }: ContractOpts) { - return OokiIToken__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - ookiTokenRegistry({ address, network }: ContractOpts) { - return OokiTokenRegistry__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } -} diff --git a/src/apps/ooki/contracts/viem/OokiIToken.ts b/src/apps/ooki/contracts/viem/OokiIToken.ts deleted file mode 100644 index 8cffa7f4e..000000000 --- a/src/apps/ooki/contracts/viem/OokiIToken.ts +++ /dev/null @@ -1,970 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const ookiITokenAbi = [ - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'burner', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'tokenAmount', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'assetAmount', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'price', - type: 'uint256', - }, - ], - name: 'Burn', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'borrower', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: 'target', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: 'loanToken', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'loanAmount', - type: 'uint256', - }, - ], - name: 'FlashBorrow', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'minter', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'tokenAmount', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'assetAmount', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'price', - type: 'uint256', - }, - ], - name: 'Mint', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - inputs: [ - { - internalType: 'bytes4', - name: 'sig', - type: 'bytes4', - }, - ], - name: '_isPaused', - outputs: [ - { - internalType: 'bool', - name: 'isPaused', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_owner', - type: 'address', - }, - ], - name: 'assetBalanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'loanId', - type: 'bytes32', - }, - { - internalType: 'uint256', - name: 'withdrawAmount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'initialLoanDuration', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'collateralTokenSent', - type: 'uint256', - }, - { - internalType: 'address', - name: 'collateralTokenAddress', - type: 'address', - }, - { - internalType: 'address', - name: 'borrower', - type: 'address', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - internalType: 'bytes', - name: '', - type: 'bytes', - }, - ], - name: 'borrow', - outputs: [ - { - components: [ - { - internalType: 'bytes32', - name: 'loanId', - type: 'bytes32', - }, - { - internalType: 'uint256', - name: 'principal', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'collateral', - type: 'uint256', - }, - ], - internalType: 'struct IToken.LoanOpenData', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [], - name: 'borrowInterestRate', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - internalType: 'uint256', - name: 'burnAmount', - type: 'uint256', - }, - ], - name: 'burn', - outputs: [ - { - internalType: 'uint256', - name: 'loanAmountPaid', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address payable', - name: 'receiver', - type: 'address', - }, - { - internalType: 'uint256', - name: 'burnAmount', - type: 'uint256', - }, - ], - name: 'burnToEther', - outputs: [ - { - internalType: 'uint256', - name: 'loanAmountPaid', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newGuardian', - type: 'address', - }, - ], - name: 'changeGuardian', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_user', - type: 'address', - }, - ], - name: 'checkpointPrice', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'borrowAmount', - type: 'uint256', - }, - { - internalType: 'address', - name: 'borrower', - type: 'address', - }, - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'string', - name: 'signature', - type: 'string', - }, - { - internalType: 'bytes', - name: 'data', - type: 'bytes', - }, - ], - name: 'flashBorrow', - outputs: [ - { - internalType: 'bytes', - name: '', - type: 'bytes', - }, - ], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [], - name: 'getGuardian', - outputs: [ - { - internalType: 'address', - name: 'guardian', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getPoolUtilization', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'initialPrice', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'loanParamsIds', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'loanTokenAddress', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'loanId', - type: 'bytes32', - }, - { - internalType: 'uint256', - name: 'leverageAmount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'loanTokenSent', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'collateralTokenSent', - type: 'uint256', - }, - { - internalType: 'address', - name: 'collateralTokenAddress', - type: 'address', - }, - { - internalType: 'address', - name: 'trader', - type: 'address', - }, - { - internalType: 'bytes', - name: 'loanDataBytes', - type: 'bytes', - }, - ], - name: 'marginTrade', - outputs: [ - { - components: [ - { - internalType: 'bytes32', - name: 'loanId', - type: 'bytes32', - }, - { - internalType: 'uint256', - name: 'principal', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'collateral', - type: 'uint256', - }, - ], - internalType: 'struct IToken.LoanOpenData', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - internalType: 'uint256', - name: 'depositAmount', - type: 'uint256', - }, - ], - name: 'mint', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - ], - name: 'mintWithEther', - outputs: [], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'borrowAmount', - type: 'uint256', - }, - ], - name: 'nextBorrowInterestRate', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'int256', - name: 'supplyAmount', - type: 'int256', - }, - ], - name: 'nextSupplyInterestRate', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'owner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - ], - name: 'profitOf', - outputs: [ - { - internalType: 'int256', - name: '', - type: 'int256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_loanTokenAddress', - type: 'address', - }, - ], - name: 'revokeApproval', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_newTarget', - type: 'address', - }, - ], - name: 'setTarget', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'supplyInterestRate', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes4', - name: 'sig', - type: 'bytes4', - }, - ], - name: 'toggleFunctionPause', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes4', - name: 'sig', - type: 'bytes4', - }, - ], - name: 'toggleFunctionUnPause', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'tokenPrice', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalAssetBorrow', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalAssetSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assetSupply', - type: 'uint256', - }, - ], - name: 'totalSupplyInterestRate', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'transferOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'newFeePercent', - type: 'uint256', - }, - ], - name: 'updateFlashBorrowFeePercent', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'settingsTarget', - type: 'address', - }, - { - internalType: 'bytes', - name: 'callData', - type: 'bytes', - }, - ], - name: 'updateSettings', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type OokiIToken = typeof ookiITokenAbi; -export type OokiITokenContract = GetContractReturnType; - -export class OokiIToken__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: ookiITokenAbi, publicClient: client }); - } -} diff --git a/src/apps/ooki/contracts/viem/OokiTokenRegistry.ts b/src/apps/ooki/contracts/viem/OokiTokenRegistry.ts deleted file mode 100644 index 0fbdcf24a..000000000 --- a/src/apps/ooki/contracts/viem/OokiTokenRegistry.ts +++ /dev/null @@ -1,69 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const ookiTokenRegistryAbi = [ - { - constant: true, - inputs: [], - name: 'bZxContract', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'uint256', - name: '_start', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '_count', - type: 'uint256', - }, - ], - name: 'getTokens', - outputs: [ - { - components: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - ], - internalType: 'struct TokenRegistry.TokenMetadata[]', - name: 'metadata', - type: 'tuple[]', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, -] as const; - -export type OokiTokenRegistry = typeof ookiTokenRegistryAbi; -export type OokiTokenRegistryContract = GetContractReturnType; - -export class OokiTokenRegistry__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: ookiTokenRegistryAbi, publicClient: client }); - } -} diff --git a/src/apps/ooki/contracts/viem/index.ts b/src/apps/ooki/contracts/viem/index.ts deleted file mode 100644 index 9e0f79c25..000000000 --- a/src/apps/ooki/contracts/viem/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ - -export type { OokiIToken } from './OokiIToken'; -export type { OokiTokenRegistry } from './OokiTokenRegistry'; - -export { OokiIToken__factory } from './OokiIToken'; -export { OokiTokenRegistry__factory } from './OokiTokenRegistry'; diff --git a/src/apps/ooki/ethereum/ooki.lend.token-fetcher.ts b/src/apps/ooki/ethereum/ooki.lend.token-fetcher.ts deleted file mode 100644 index 521d3406d..000000000 --- a/src/apps/ooki/ethereum/ooki.lend.token-fetcher.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetPricePerShareParams, GetUnderlyingTokensParams } from '~position/template/app-token.template.types'; - -import { OokiViemContractFactory } from '../contracts'; -import { OokiIToken } from '../contracts/viem'; - -@PositionTemplate() -export class EthereumOokiLendTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Lending'; - - tokenRegistryAddress = '0xf0e474592b455579fe580d610b846bdbb529c6f7'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(OokiViemContractFactory) protected readonly contractFactory: OokiViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.ookiIToken({ address, network: this.network }); - } - - async getAddresses(): Promise { - const registryContract = this.contractFactory.ookiTokenRegistry({ - network: this.network, - address: this.tokenRegistryAddress, - }); - - const tokenAddresses = await registryContract.read.getTokens([BigInt(0), BigInt(100)]); - return tokenAddresses.map(v => v.token); - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.loanTokenAddress(), network: this.network }]; - } - - async getPricePerShare({ contract }: GetPricePerShareParams) { - const exchangeRateRaw = await contract.read.tokenPrice(); - const exchangeRate = Number(exchangeRateRaw) / 10 ** 18; - return [exchangeRate]; - } -} diff --git a/src/apps/ooki/ooki.module.ts b/src/apps/ooki/ooki.module.ts deleted file mode 100644 index d81812440..000000000 --- a/src/apps/ooki/ooki.module.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { AbstractApp } from '~app/app.dynamic-module'; - -import { ArbitrumOokiLendTokenFetcher } from './arbitrum/ooki.lend.token-fetcher'; -import { BinanceSmartChainOokiLendTokenFetcher } from './binance-smart-chain/ooki.lend.token-fetcher'; -import { OokiViemContractFactory } from './contracts'; -import { EthereumOokiLendTokenFetcher } from './ethereum/ooki.lend.token-fetcher'; -import { OptimismOokiLendTokenFetcher } from './optimism/ooki.lend.token-fetcher'; -import { PolygonOokiLendTokenFetcher } from './polygon/ooki.lend.token-fetcher'; - -@Module({ - providers: [ - ArbitrumOokiLendTokenFetcher, - BinanceSmartChainOokiLendTokenFetcher, - EthereumOokiLendTokenFetcher, - OptimismOokiLendTokenFetcher, - PolygonOokiLendTokenFetcher, - - OokiViemContractFactory, - ], -}) -export class OokiAppModule extends AbstractApp() {} diff --git a/src/apps/ooki/optimism/ooki.lend.token-fetcher.ts b/src/apps/ooki/optimism/ooki.lend.token-fetcher.ts deleted file mode 100644 index 5fc36aa4e..000000000 --- a/src/apps/ooki/optimism/ooki.lend.token-fetcher.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetPricePerShareParams, GetUnderlyingTokensParams } from '~position/template/app-token.template.types'; - -import { OokiViemContractFactory } from '../contracts'; -import { OokiIToken } from '../contracts/viem'; - -@PositionTemplate() -export class OptimismOokiLendTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Lending'; - - tokenRegistryAddress = '0x22a2208eeedeb1e2156370fd1c1c081355c68f2b'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(OokiViemContractFactory) protected readonly contractFactory: OokiViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.ookiIToken({ address, network: this.network }); - } - - async getAddresses(): Promise { - const registryContract = this.contractFactory.ookiTokenRegistry({ - network: this.network, - address: this.tokenRegistryAddress, - }); - - const tokenAddresses = await registryContract.read.getTokens([BigInt(0), BigInt(100)]); - return tokenAddresses.map(v => v.token); - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.loanTokenAddress(), network: this.network }]; - } - - async getPricePerShare({ contract }: GetPricePerShareParams) { - const exchangeRateRaw = await contract.read.tokenPrice(); - const exchangeRate = Number(exchangeRateRaw) / 10 ** 18; - return [exchangeRate]; - } -} diff --git a/src/apps/ooki/polygon/ooki.lend.token-fetcher.ts b/src/apps/ooki/polygon/ooki.lend.token-fetcher.ts deleted file mode 100644 index 8dfad9050..000000000 --- a/src/apps/ooki/polygon/ooki.lend.token-fetcher.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetPricePerShareParams, GetUnderlyingTokensParams } from '~position/template/app-token.template.types'; - -import { OokiViemContractFactory } from '../contracts'; -import { OokiIToken } from '../contracts/viem'; - -@PositionTemplate() -export class PolygonOokiLendTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Lending'; - - tokenRegistryAddress = '0x4b234781af34e9fd756c27a47675cbba19dc8765'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(OokiViemContractFactory) protected readonly contractFactory: OokiViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.ookiIToken({ address, network: this.network }); - } - - async getAddresses(): Promise { - const registryContract = this.contractFactory.ookiTokenRegistry({ - network: this.network, - address: this.tokenRegistryAddress, - }); - - const tokenAddresses = await registryContract.read.getTokens([BigInt(0), BigInt(100)]); - return tokenAddresses.map(v => v.token); - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.loanTokenAddress(), network: this.network }]; - } - - async getPricePerShare({ contract }: GetPricePerShareParams) { - const exchangeRateRaw = await contract.read.tokenPrice(); - const exchangeRate = Number(exchangeRateRaw) / 10 ** 18; - return [exchangeRate]; - } -} diff --git a/src/apps/plutus/arbitrum/plutus.plv-glp.token-fetcher.ts b/src/apps/plutus/arbitrum/plutus.plv-glp.token-fetcher.ts deleted file mode 100644 index 061e3a721..000000000 --- a/src/apps/plutus/arbitrum/plutus.plv-glp.token-fetcher.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { Inject } from '@nestjs/common'; -import { BigNumber } from 'ethers'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetDataPropsParams, - GetPricePerShareParams, - GetUnderlyingTokensParams, -} from '~position/template/app-token.template.types'; - -import { PlutusViemContractFactory } from '../contracts'; -import { PlutusPlvGlp } from '../contracts/viem/PlutusPlvGlp'; - -@PositionTemplate() -export class ArbitrumPlutusPlvGlpTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'plvGLP'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(PlutusViemContractFactory) protected readonly contractFactory: PlutusViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.plutusPlvGlp({ address, network: this.network }); - } - - getAddresses() { - return ['0x5326e71ff593ecc2cf7acae5fe57582d6e74cff1']; - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.asset(), network: this.network }]; - } - - async getPricePerShare({ contract }: GetPricePerShareParams) { - const oneUnit = BigNumber.from(10).pow(18).toString(); - const pricePerShareRaw = await contract.read.convertToAssets([BigInt(oneUnit)]); - const pricePerShare = Number(pricePerShareRaw) / 10 ** 18; - return [pricePerShare]; - } - - async getLiquidity({ appToken, contract }: GetDataPropsParams) { - const reserveRaw = await contract.read.totalAssets(); - const reserve = Number(reserveRaw) / 10 ** appToken.tokens[0].decimals; - const liquidity = reserve * appToken.tokens[0].price; - return liquidity; - } - - async getReserves({ appToken, contract }: GetDataPropsParams) { - const reserveRaw = await contract.read.totalAssets(); - const reserve = Number(reserveRaw) / 10 ** appToken.tokens[0].decimals; - return [reserve]; - } -} diff --git a/src/apps/plutus/plutus.module.ts b/src/apps/plutus/plutus.module.ts index 8c76d75c8..9fac4b75b 100644 --- a/src/apps/plutus/plutus.module.ts +++ b/src/apps/plutus/plutus.module.ts @@ -16,7 +16,6 @@ import { ArbitrumPlutusLockContractPositionFetcher } from './arbitrum/plutus.loc import { ArbitrumPlutusPlsDpxTokenFetcher } from './arbitrum/plutus.pls-dpx.token-fetcher'; import { ArbitrumPlutusPlsRdntTokenFetcher } from './arbitrum/plutus.pls-rdnt.token-fetcher'; import { ArbitrumPlutusPlsSpaTokenFetcher } from './arbitrum/plutus.pls-spa.token-fetcher'; -import { ArbitrumPlutusPlvGlpTokenFetcher } from './arbitrum/plutus.plv-glp.token-fetcher'; import { ArbitrumPlutusTgeClaimableContractPositionFetcher } from './arbitrum/plutus.tge-claimable.contract-position-fetcher'; import { ArbitrumPlutusVaultTokenFetcher } from './arbitrum/plutus.vault.token-fetcher'; import { PlutusViemContractFactory } from './contracts'; @@ -35,7 +34,6 @@ import { PlutusViemContractFactory } from './contracts'; ArbitrumPlutusFarmPlsLpContractPositionFetcher, ArbitrumPlutusLockContractPositionFetcher, ArbitrumPlutusVaultTokenFetcher, - ArbitrumPlutusPlvGlpTokenFetcher, ArbitrumPlutusTgeClaimableContractPositionFetcher, ArbitrumPlutusFarmPlsRdntContractPositionFetcher, // plsASSETs diff --git a/src/apps/qi-dao/contracts/abis/qi-dao-yield-token.json b/src/apps/qi-dao/contracts/abis/qi-dao-yield-token.json deleted file mode 100644 index e3b86da5f..000000000 --- a/src/apps/qi-dao/contracts/abis/qi-dao-yield-token.json +++ /dev/null @@ -1,314 +0,0 @@ -[ - { - "inputs": [ - { "internalType": "address", "name": "amToken", "type": "address" }, - { "internalType": "address", "name": "underlying", "type": "address" }, - { "internalType": "string", "name": "name", "type": "string" }, - { "internalType": "string", "name": "symbol", "type": "string" }, - { "internalType": "uint8", "name": "decimals", "type": "uint8" } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "constant": true, - "inputs": [], - "name": "AaveContract", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "LENDING_POOL", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "Token", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "aave", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "claimAaveRewards", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "subtractedValue", "type": "uint256" } - ], - "name": "decreaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "depositFeeBP", - "outputs": [{ "internalType": "uint16", "name": "", "type": "uint16" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "internalType": "uint256", "name": "_amount", "type": "uint256" }], - "name": "enter", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "harvestMaticIntoToken", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "addedValue", "type": "uint256" } - ], - "name": "increaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "internalType": "uint256", "name": "_share", "type": "uint256" }], - "name": "leave", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "operator", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { "internalType": "address", "name": "sender", "type": "address" }, - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "treasury", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "uni", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "internalType": "uint16", "name": "_depositFee", "type": "uint16" }], - "name": "updateDepositFee", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "internalType": "address", "name": "_operator", "type": "address" }], - "name": "updateOperator", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "internalType": "address", "name": "_treasury", "type": "address" }], - "name": "updateTreasury", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [{ "internalType": "address", "name": "_router", "type": "address" }], - "name": "updateUniV2Router", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "wMatic", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "weth", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "payable": false, - "stateMutability": "view", - "type": "function" - } -] diff --git a/src/apps/qi-dao/contracts/viem.contract-factory.ts b/src/apps/qi-dao/contracts/viem.contract-factory.ts index ddd07f61e..471bd77d1 100644 --- a/src/apps/qi-dao/contracts/viem.contract-factory.ts +++ b/src/apps/qi-dao/contracts/viem.contract-factory.ts @@ -10,7 +10,6 @@ import { QiDaoMasterChefV3__factory, QiDaoVaultInfo__factory, QiDaoVaultNft__factory, - QiDaoYieldToken__factory, } from './viem'; type ContractOpts = { address: string; network: Network }; @@ -37,7 +36,4 @@ export class QiDaoViemContractFactory { qiDaoVaultNft({ address, network }: ContractOpts) { return QiDaoVaultNft__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } - qiDaoYieldToken({ address, network }: ContractOpts) { - return QiDaoYieldToken__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } } diff --git a/src/apps/qi-dao/contracts/viem/QiDaoYieldToken.ts b/src/apps/qi-dao/contracts/viem/QiDaoYieldToken.ts deleted file mode 100644 index c864b56ac..000000000 --- a/src/apps/qi-dao/contracts/viem/QiDaoYieldToken.ts +++ /dev/null @@ -1,598 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const qiDaoYieldTokenAbi = [ - { - inputs: [ - { - internalType: 'address', - name: 'amToken', - type: 'address', - }, - { - internalType: 'address', - name: 'underlying', - type: 'address', - }, - { - internalType: 'string', - name: 'name', - type: 'string', - }, - { - internalType: 'string', - name: 'symbol', - type: 'string', - }, - { - internalType: 'uint8', - name: 'decimals', - type: 'uint8', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - constant: true, - inputs: [], - name: 'AaveContract', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'LENDING_POOL', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'Token', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'aave', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [], - name: 'claimAaveRewards', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'subtractedValue', - type: 'uint256', - }, - ], - name: 'decreaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'depositFeeBP', - outputs: [ - { - internalType: 'uint16', - name: '', - type: 'uint16', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'enter', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [], - name: 'harvestMaticIntoToken', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'addedValue', - type: 'uint256', - }, - ], - name: 'increaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'uint256', - name: '_share', - type: 'uint256', - }, - ], - name: 'leave', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'operator', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'treasury', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'uni', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'uint16', - name: '_depositFee', - type: 'uint16', - }, - ], - name: 'updateDepositFee', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: '_operator', - type: 'address', - }, - ], - name: 'updateOperator', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: '_treasury', - type: 'address', - }, - ], - name: 'updateTreasury', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: false, - inputs: [ - { - internalType: 'address', - name: '_router', - type: 'address', - }, - ], - name: 'updateUniV2Router', - outputs: [], - payable: false, - stateMutability: 'nonpayable', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'wMatic', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, - { - constant: true, - inputs: [], - name: 'weth', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - payable: false, - stateMutability: 'view', - type: 'function', - }, -] as const; - -export type QiDaoYieldToken = typeof qiDaoYieldTokenAbi; -export type QiDaoYieldTokenContract = GetContractReturnType; - -export class QiDaoYieldToken__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: qiDaoYieldTokenAbi, publicClient: client }); - } -} diff --git a/src/apps/qi-dao/contracts/viem/index.ts b/src/apps/qi-dao/contracts/viem/index.ts index f1bd37256..d5b908fc0 100644 --- a/src/apps/qi-dao/contracts/viem/index.ts +++ b/src/apps/qi-dao/contracts/viem/index.ts @@ -8,7 +8,6 @@ export type { QiDaoMasterChefV3 } from './QiDaoMasterChefV3'; export type { QiDaoMasterChef } from './QiDaoMasterChef'; export type { QiDaoVaultInfo } from './QiDaoVaultInfo'; export type { QiDaoVaultNft } from './QiDaoVaultNft'; -export type { QiDaoYieldToken } from './QiDaoYieldToken'; export { QiDaoAnchorVault__factory } from './QiDaoAnchorVault'; export { QiDaoEscrowedQi__factory } from './QiDaoEscrowedQi'; @@ -16,4 +15,3 @@ export { QiDaoMasterChefV3__factory } from './QiDaoMasterChefV3'; export { QiDaoMasterChef__factory } from './QiDaoMasterChef'; export { QiDaoVaultInfo__factory } from './QiDaoVaultInfo'; export { QiDaoVaultNft__factory } from './QiDaoVaultNft'; -export { QiDaoYieldToken__factory } from './QiDaoYieldToken'; diff --git a/src/apps/qi-dao/polygon/qi-dao.yield.token-fetcher.ts b/src/apps/qi-dao/polygon/qi-dao.yield.token-fetcher.ts deleted file mode 100644 index 881bba2f7..000000000 --- a/src/apps/qi-dao/polygon/qi-dao.yield.token-fetcher.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetUnderlyingTokensParams, GetPricePerShareParams } from '~position/template/app-token.template.types'; - -import { QiDaoViemContractFactory } from '../contracts'; -import { QiDaoYieldToken } from '../contracts/viem'; - -@PositionTemplate() -export class PolygonQiDaoYieldTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Yield Tokens'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(QiDaoViemContractFactory) protected readonly contractFactory: QiDaoViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.qiDaoYieldToken({ address, network: this.network }); - } - - async getAddresses() { - return [ - '0x22965e296d9a0cd0e917d6d70ef2573009f8a1bb', // camUSDC - '0x7068ea5255cb05931efa8026bd04b18f3deb8b0b', // camWMATIC - '0xe6c23289ba5a9f0ef31b8eb36241d5c800889b7b', // camDAI - '0x0470cd31c8fcc42671465880ba81d631f0b76c1d', // camWETH - '0xb3911259f435b28ec072e4ff6ff5a2c604fea0fb', // camUSDT - '0xea4040b21cb68afb94889cb60834b13427cfc4eb', // camAAVE - '0xba6273a78a23169e01317bd0f6338547f869e8df', // camWBTC - ]; - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.Token(), network: this.network }]; - } - - async getPricePerShare({ appToken }: GetPricePerShareParams) { - const underlyingToken = appToken.tokens[0]; - const underlyingTokenContract = this.appToolkit.globalViemContracts.erc20({ - address: underlyingToken.address, - network: this.network, - }); - - const reserveRaw = await underlyingTokenContract.read.balanceOf([appToken.address]); - const reserve = Number(reserveRaw) / 10 ** underlyingToken.decimals; - const pricePerShare = reserve / appToken.supply; - - return [pricePerShare]; - } -} diff --git a/src/apps/qi-dao/qi-dao.module.ts b/src/apps/qi-dao/qi-dao.module.ts index 732fa5be9..1ca8e2437 100644 --- a/src/apps/qi-dao/qi-dao.module.ts +++ b/src/apps/qi-dao/qi-dao.module.ts @@ -18,7 +18,6 @@ import { PolygonQiDaoEscrowedQiContractPositionFetcher } from './polygon/qi-dao. import { PolygonQiDaoFarmV3ContractPositionFetcher } from './polygon/qi-dao.farm-v3.contract-position-fetcher'; import { PolygonQiDaoFarmContractPositionFetcher } from './polygon/qi-dao.farm.contract-position-fetcher'; import { PolygonQiDaoVaultPositionFetcher } from './polygon/qi-dao.vault.contract-position-fetcher'; -import { PolygonQiDaoYieldTokenFetcher } from './polygon/qi-dao.yield.token-fetcher'; @Module({ providers: [ @@ -46,7 +45,6 @@ import { PolygonQiDaoYieldTokenFetcher } from './polygon/qi-dao.yield.token-fetc PolygonQiDaoFarmContractPositionFetcher, PolygonQiDaoFarmV3ContractPositionFetcher, PolygonQiDaoVaultPositionFetcher, - PolygonQiDaoYieldTokenFetcher, ], }) export class QiDaoAppModule extends AbstractApp() {} diff --git a/src/apps/rigoblock/arbitrum/rigoblock.pool.contract-position-fetcher.ts b/src/apps/rigoblock/arbitrum/rigoblock.pool.contract-position-fetcher.ts deleted file mode 100644 index 2da5b1cad..000000000 --- a/src/apps/rigoblock/arbitrum/rigoblock.pool.contract-position-fetcher.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { RigoblockPoolContractPositionFetcher } from '../common/rigoblock.pool.contract-position-fetcher'; - -@PositionTemplate() -export class ArbitrumRigoblockPoolContractPositionFetcher extends RigoblockPoolContractPositionFetcher { - groupLabel = 'Smart Pools'; - - positionManagerAddress = '0xc36442b4a4522e871399cd717abdd847ab11fe88'; - factoryAddress = '0x1f98431c8ad98523631ae4a59f267346ea31f984'; -} diff --git a/src/apps/rigoblock/arbitrum/rigoblock.pool.token-fetcher.ts b/src/apps/rigoblock/arbitrum/rigoblock.pool.token-fetcher.ts deleted file mode 100644 index 28c400a27..000000000 --- a/src/apps/rigoblock/arbitrum/rigoblock.pool.token-fetcher.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { RigoblockPoolTokenFetcher } from '../common/rigoblock.pool.token-fetcher'; - -@PositionTemplate() -export class ArbitrumRigoblockPoolTokenFetcher extends RigoblockPoolTokenFetcher { - groupLabel = 'Smart Pools'; -} diff --git a/src/apps/rigoblock/assets/logo.png b/src/apps/rigoblock/assets/logo.png deleted file mode 100644 index 59e4adf733d6f9bda484f4d79b4f91561e5a9b05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9031 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 diff --git a/src/apps/rigoblock/common/rigoblock.log-provider.ts b/src/apps/rigoblock/common/rigoblock.log-provider.ts deleted file mode 100644 index 4a6ce1e02..000000000 --- a/src/apps/rigoblock/common/rigoblock.log-provider.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Inject, Injectable } from '@nestjs/common'; -import { duration } from 'moment'; - -import { Cache } from '~cache/cache.decorator'; -import { Network } from '~types'; - -import { RigoblockViemContractFactory } from '../contracts'; - -export enum PoolLogType { - REGISTERED = 'registered', - TOKEN_WHITELISTED = 'whitelisted', -} - -@Injectable() -export class RigoblockLogProvider { - constructor(@Inject(RigoblockViemContractFactory) private readonly contractFactory: RigoblockViemContractFactory) {} - - @Cache({ - key: ({ network, address, fromBlock }: { network: Network; fromBlock: number; address: string }) => - `rigoblock:${network}:rigoblock-logs:${address}:${fromBlock}:registered`, - ttl: duration(8, 'hours').asSeconds(), - }) - async getRigoblockRegisteredLogs({ - fromBlock, - network, - address, - }: { - address: string; - network: Network; - fromBlock: number; - }) { - const contract = this.contractFactory.poolRegistry({ network, address }); - const logs = await contract.getEvents.Registered({}, { fromBlock: BigInt(fromBlock) }); - return logs; - } - - @Cache({ - key: ({ network, address, fromBlock }: { network: Network; fromBlock: number; address: string }) => - `rigoblock:${network}:rigoblock-logs:${address}:${fromBlock}:whitelisted`, - ttl: duration(8, 'hours').asSeconds(), - }) - async getRigoblockWhitelistedLogs({ - fromBlock, - network, - address, - }: { - address: string; - network: Network; - fromBlock: number; - }) { - const contract = this.contractFactory.tokenWhitelist({ network, address }); - const logs = await contract.getEvents.Whitelisted({}, { fromBlock: BigInt(fromBlock) }); - return logs; - } -} diff --git a/src/apps/rigoblock/common/rigoblock.pool.contract-position-fetcher.ts b/src/apps/rigoblock/common/rigoblock.pool.contract-position-fetcher.ts deleted file mode 100644 index 33f99b8d4..000000000 --- a/src/apps/rigoblock/common/rigoblock.pool.contract-position-fetcher.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { Inject } from '@nestjs/common'; -import { compact, range, sumBy } from 'lodash'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { UniswapV3LiquidityContractPositionBuilder } from '~apps/uniswap-v3/common/uniswap-v3.liquidity.contract-position-builder'; -import { UniswapV3LiquidityPositionDataProps } from '~apps/uniswap-v3/common/uniswap-v3.liquidity.contract-position-fetcher'; -import { UniswapV3ViemContractFactory } from '~apps/uniswap-v3/contracts'; -import { ContractPositionBalance } from '~position/position-balance.interface'; -import { MetaType } from '~position/position.interface'; -import { ContractPositionTemplatePositionFetcher } from '~position/template/contract-position.template.position-fetcher'; - -import { RigoblockViemContractFactory } from '../contracts'; -import { SmartPool } from '../contracts/viem'; - -export type UnderlyingLiquidityPositionTokens = { - address: string; - balance: number; - balanceRaw: string; - balanceUSD: number; -}; - -export type RigoblockLiquidityDataProps = { - liquidity: number; - liquidityPositions: UnderlyingLiquidityPositionTokens[]; -}; - -export type RigoblockPoolAppTokenDefinition = { - address: string; - label: string; - underlyingTokenBalances: ContractPositionBalance[]; -}; - -export abstract class RigoblockPoolContractPositionFetcher extends ContractPositionTemplatePositionFetcher< - SmartPool, - RigoblockLiquidityDataProps, - RigoblockPoolAppTokenDefinition -> { - abstract positionManagerAddress: string; - abstract groupLabel: string; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(RigoblockViemContractFactory) protected readonly rigoblockContractFactory: RigoblockViemContractFactory, - @Inject(UniswapV3ViemContractFactory) protected readonly contractFactory: UniswapV3ViemContractFactory, - @Inject(UniswapV3LiquidityContractPositionBuilder) - protected readonly uniswapV3LiquidityContractPositionBuilder: UniswapV3LiquidityContractPositionBuilder, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.rigoblockContractFactory.smartPool({ address, network: this.network }); - } - - async getDefinitions(): Promise { - const appTokens = await this.appToolkit.getAppTokenPositions({ - appId: this.appId, - network: this.network, - groupIds: ['pool'], - }); - - return await Promise.all( - appTokens.map(async pool => { - const underlyingTokenBalances = await this.getUnderlyingBalances(pool.address); - return { - address: pool.address, - label: pool.displayProps.label, - underlyingTokenBalances: underlyingTokenBalances, - }; - }), - ); - } - - // we define the liquidity position of a rigoblock pool - async getTokenDefinitions({ definition }) { - return definition.underlyingTokenBalances - .map(balance => { - return balance.tokens.map(token => { - return [ - { - metaType: MetaType.SUPPLIED, - address: token.address, - network: this.network, - }, - ]; - }); - }) - .flat(2); - } - - async getDataProps({ definition }): Promise { - const liquidityBalances = definition.underlyingTokenBalances; - const liquidityPositions: UnderlyingLiquidityPositionTokens[] = liquidityBalances - .map(balance => { - return balance.tokens.map(token => { - return { - address: token.address, - balance: token.balance, - balanceRaw: token.balanceRaw, - balanceUSD: token.balanceUSD, - }; - }); - }) - .flat(1); - const liquidity = sumBy(liquidityPositions, v => v.balanceUSD); - return { - liquidity: liquidity, - liquidityPositions: liquidityPositions, - }; - } - - async getLabel({ definition }) { - return definition.label; - } - - async getTokenBalancesPerPosition({ contractPosition }) { - const { dataProps } = contractPosition; - return dataProps.liquidityPositions.map(v => v.balanceRaw); - } - - async getUnderlyingBalances( - address: string, - ): Promise[]> { - // @TODO: Rely on contract positions when we can correctly index all pools - const multicall = this.appToolkit.getViemMulticall(this.network); - const tokenLoader = this.appToolkit.getTokenDependencySelector({ - tags: { network: this.network, context: `${this.appId}__template_balances` }, - }); - - const positionManager = this.contractFactory.uniswapV3PositionManager({ - address: this.positionManagerAddress, - network: this.network, - }); - - const numPositionsRaw = await positionManager.read.balanceOf([address]); - const balances = await Promise.all( - range(0, Number(numPositionsRaw)).map(async index => - this.uniswapV3LiquidityContractPositionBuilder.buildPosition({ - positionId: await multicall.wrap(positionManager).read.tokenOfOwnerByIndex([address, BigInt(index)]), - network: this.network, - multicall, - tokenLoader, - }), - ), - ); - - return compact(balances); - } -} diff --git a/src/apps/rigoblock/common/rigoblock.pool.pool-builders.ts b/src/apps/rigoblock/common/rigoblock.pool.pool-builders.ts deleted file mode 100644 index 322d8f452..000000000 --- a/src/apps/rigoblock/common/rigoblock.pool.pool-builders.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Network } from '~types'; - -export const POOL_BUILDERS: Partial< - Record< - Network, - { - registryAddress: string; - tokenWhitelistAddress: string; - blockNumber: number; - }[] - > -> = { - [Network.ETHEREUM_MAINNET]: [ - { - registryAddress: '0x06767e8090ba5c4eca89ed00c3a719909d503ed6', - tokenWhitelistAddress: '0xb43bad2638696f8bc82247b92bd56b8df37d89ab', - blockNumber: 15817831, - }, - ], - [Network.POLYGON_MAINNET]: [ - { - registryAddress: '0x06767e8090ba5c4eca89ed00c3a719909d503ed6', - tokenWhitelistAddress: '0xb43bad2638696f8bc82247b92bd56b8df37d89ab', - blockNumber: 34751673, - }, - ], - [Network.ARBITRUM_MAINNET]: [ - { - registryAddress: '0x06767e8090ba5c4eca89ed00c3a719909d503ed6', - tokenWhitelistAddress: '0xb43bad2638696f8bc82247b92bd56b8df37d89ab', - blockNumber: 32290603, - }, - ], - [Network.OPTIMISM_MAINNET]: [ - { - registryAddress: '0x06767e8090ba5c4eca89ed00c3a719909d503ed6', - tokenWhitelistAddress: '0xb43bad2638696f8bc82247b92bd56b8df37d89ab', - blockNumber: 31239008, - }, - ], -}; diff --git a/src/apps/rigoblock/common/rigoblock.pool.token-fetcher.ts b/src/apps/rigoblock/common/rigoblock.pool.token-fetcher.ts deleted file mode 100644 index 9bb6a1f75..000000000 --- a/src/apps/rigoblock/common/rigoblock.pool.token-fetcher.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { parseBytes32String } from '@ethersproject/strings'; -import { Inject } from '@nestjs/common'; -import { compact } from 'lodash'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { ZERO_ADDRESS } from '~app-toolkit/constants/address'; -import { DefaultDataProps } from '~position/display.interface'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetAddressesParams, - DefaultAppTokenDefinition, - GetDisplayPropsParams, - GetPricePerShareParams, - DefaultAppTokenDataProps, -} from '~position/template/app-token.template.types'; -import { BaseToken } from '~position/token.interface'; - -import { RigoblockViemContractFactory } from '../contracts'; -import { SmartPool } from '../contracts/viem'; - -import { PoolLogType, RigoblockLogProvider } from './rigoblock.log-provider'; -import { POOL_BUILDERS } from './rigoblock.pool.pool-builders'; - -type RigoblockSmartPoolDefinition = DefaultAppTokenDefinition & { - logType: PoolLogType; - address: string; - name: string; - tokenList?: WhitelistedTokenDefinition[]; -}; - -type WhitelistedTokenDefinition = DefaultAppTokenDefinition & { - logType?: PoolLogType; - address: string; -}; - -type RToken = BaseToken & { - hide: boolean; -}; - -export abstract class RigoblockPoolTokenFetcher extends AppTokenTemplatePositionFetcher< - SmartPool, - DefaultAppTokenDataProps, - RigoblockSmartPoolDefinition -> { - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(RigoblockViemContractFactory) private readonly contractFactory: RigoblockViemContractFactory, - @Inject(RigoblockLogProvider) private readonly logProvider: RigoblockLogProvider, - ) { - super(appToolkit); - } - - extraDefinitions: RigoblockSmartPoolDefinition[] = []; - - async getDefinitions(): Promise { - const poolBuilders = POOL_BUILDERS[this.network] ?? []; - // we query tracked tokens here to save redundant calls - const tokenList = await this.getTokenList(); - - // Get all logs for each pool builder contract - const builderLogs = await Promise.all( - poolBuilders.map(({ registryAddress, blockNumber }) => - this.logProvider.getRigoblockRegisteredLogs({ - fromBlock: blockNumber, - address: registryAddress.toLowerCase(), - network: this.network, - }), - ), - ); - - const definitions = await Promise.all( - builderLogs.flatMap(logs => - logs.map(async log => { - const poolAddress = log.args.pool!.toLowerCase(); - const name = log.args.name!.toLowerCase(); - - return { - logType: PoolLogType.REGISTERED, - address: poolAddress, - name: parseBytes32String(name), - tokenList, - }; - }), - ), - ); - - return [...definitions, ...this.extraDefinitions]; - } - - async getAddresses({ definitions }: GetAddressesParams): Promise { - return definitions.map(definition => definition.address); - } - - getContract(address: string) { - return this.contractFactory.smartPool({ address, network: this.network }); - } - - // whitelisted tokens are filtered by those that are not tracked - async getTokenList(): Promise { - const tokenList = [...new Set(await this.getTokenWhitelist())]; - tokenList.push({ address: ZERO_ADDRESS }); - const baseTokens = (await this.appToolkit.getBaseTokenPrices(this.network)) as RToken[]; - const trackedTokens = tokenList.map(token => { - const tokenFound = baseTokens.find(p => p.address === token.address && !p.hide); - if (!tokenFound) return null; - return token; - }); - return compact(trackedTokens); - } - - async getTokenWhitelist(): Promise { - const tokenBuilders = POOL_BUILDERS[this.network] ?? []; - - const tokenLogs = await Promise.all( - tokenBuilders.map(({ tokenWhitelistAddress, blockNumber }) => - this.logProvider.getRigoblockWhitelistedLogs({ - fromBlock: blockNumber, - address: tokenWhitelistAddress.toLowerCase(), - network: this.network, - }), - ), - ); - - return await Promise.all( - tokenLogs.flatMap(logs => - logs.map(async log => { - const tokenAddress = log.args.token!.toLowerCase(); - - return { - logType: PoolLogType.TOKEN_WHITELISTED, - address: tokenAddress, - }; - }), - ), - ); - } - - async getUnderlyingTokenDefinitions({ - multicall, - definition, - }: GetDisplayPropsParams) { - // this block returns only held tokens. However, it would require less RPC calls to just multicall - // all tokens and display in UI only tokens with positive balances. - const tokens = definition.tokenList; - if (!tokens || tokens?.length === 0) return []; - const heldTokens: WhitelistedTokenDefinition[] = []; - for (let i = 0; i !== tokens.length; i++) { - if (tokens[i].address !== ZERO_ADDRESS) { - const uTokenContract = this.appToolkit.globalViemContracts.erc20({ - address: tokens[i].address, - network: this.network, - }); - const poolTokenBalance = await multicall.wrap(uTokenContract).read.balanceOf([definition.address]); - if (poolTokenBalance && Number(poolTokenBalance) > 0) { - heldTokens[i] = tokens[i]; - } - } else { - const ethBalance = await multicall.wrap(multicall.contract).read.getEthBalance([definition.address]); - if (ethBalance && Number(ethBalance) > 0) { - heldTokens[i] = tokens[i]; - } - } - } - - return compact(heldTokens).map(x => ({ address: x.address.toLowerCase(), network: this.network })); - } - - async getPricePerShare({ - appToken, - multicall, - }: GetPricePerShareParams) { - if (appToken.supply === 0) return appToken.tokens.map(() => 0); - - const reserves = await Promise.all( - appToken.tokens.map(async token => { - if (token.address === ZERO_ADDRESS) { - const ethBalance = await multicall.wrap(multicall.contract).read.getEthBalance([appToken.address]); - return Number(ethBalance) / 10 ** 18; - } - const uTokenContract = this.appToolkit.globalViemContracts.erc20({ - address: token.address, - network: this.network, - }); - const reserveRaw = await multicall.wrap(uTokenContract).read.balanceOf([appToken.address]); - const reserve = Number(reserveRaw) / 10 ** token.decimals; - return reserve; - }), - ); - - return reserves.map(r => { - return r == 0 ? 0 : r / appToken.supply; - }); - } - - async getLabel({ - definition, - }: GetDisplayPropsParams): Promise { - return definition.name; - } -} diff --git a/src/apps/rigoblock/contracts/abis/governance.json b/src/apps/rigoblock/contracts/abis/governance.json deleted file mode 100644 index 7a51fc70f..000000000 --- a/src/apps/rigoblock/contracts/abis/governance.json +++ /dev/null @@ -1,318 +0,0 @@ -[ - { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "proposer", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "proposalId", "type": "uint256" }, - { - "components": [ - { "internalType": "address", "name": "target", "type": "address" }, - { "internalType": "bytes", "name": "data", "type": "bytes" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "indexed": false, - "internalType": "struct IGovernanceVoting.ProposedAction[]", - "name": "actions", - "type": "tuple[]" - }, - { "indexed": false, "internalType": "uint256", "name": "startBlockOrTime", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "endBlockOrTime", "type": "uint256" }, - { "indexed": false, "internalType": "string", "name": "description", "type": "string" } - ], - "name": "ProposalCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256", "name": "proposalId", "type": "uint256" }], - "name": "ProposalExecuted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "newStrategy", "type": "address" }], - "name": "StrategyUpgraded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "uint256", "name": "proposalThreshold", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "quorumThreshold", "type": "uint256" } - ], - "name": "ThresholdsUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": true, "internalType": "address", "name": "newImplementation", "type": "address" }], - "name": "Upgraded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "voter", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "proposalId", "type": "uint256" }, - { "indexed": false, "internalType": "enum IGovernanceVoting.VoteType", "name": "voteType", "type": "uint8" }, - { "indexed": false, "internalType": "uint256", "name": "votingPower", "type": "uint256" } - ], - "name": "VoteCast", - "type": "event" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, - { "internalType": "enum IGovernanceVoting.VoteType", "name": "voteType", "type": "uint8" } - ], - "name": "castVote", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, - { "internalType": "enum IGovernanceVoting.VoteType", "name": "voteType", "type": "uint8" }, - { "internalType": "uint8", "name": "v", "type": "uint8" }, - { "internalType": "bytes32", "name": "r", "type": "bytes32" }, - { "internalType": "bytes32", "name": "s", "type": "bytes32" } - ], - "name": "castVoteBySignature", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "proposalId", "type": "uint256" }], - "name": "execute", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "proposalId", "type": "uint256" }], - "name": "getActions", - "outputs": [ - { - "components": [ - { "internalType": "address", "name": "target", "type": "address" }, - { "internalType": "bytes", "name": "data", "type": "bytes" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "internalType": "struct IGovernanceVoting.ProposedAction[]", - "name": "proposedActions", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "proposalId", "type": "uint256" }], - "name": "getProposalById", - "outputs": [ - { - "components": [ - { - "components": [ - { "internalType": "uint256", "name": "actionsLength", "type": "uint256" }, - { "internalType": "uint256", "name": "startBlockOrTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endBlockOrTime", "type": "uint256" }, - { "internalType": "uint256", "name": "votesFor", "type": "uint256" }, - { "internalType": "uint256", "name": "votesAgainst", "type": "uint256" }, - { "internalType": "uint256", "name": "votesAbstain", "type": "uint256" }, - { "internalType": "bool", "name": "executed", "type": "bool" } - ], - "internalType": "struct IGovernanceState.Proposal", - "name": "proposal", - "type": "tuple" - }, - { - "components": [ - { "internalType": "address", "name": "target", "type": "address" }, - { "internalType": "bytes", "name": "data", "type": "bytes" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "internalType": "struct IGovernanceVoting.ProposedAction[]", - "name": "proposedAction", - "type": "tuple[]" - } - ], - "internalType": "struct IGovernanceState.ProposalWrapper", - "name": "proposalWrapper", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "proposalId", "type": "uint256" }], - "name": "getProposalState", - "outputs": [{ "internalType": "enum IGovernanceState.ProposalState", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, - { "internalType": "address", "name": "voter", "type": "address" } - ], - "name": "getReceipt", - "outputs": [ - { - "components": [ - { "internalType": "bool", "name": "hasVoted", "type": "bool" }, - { "internalType": "uint96", "name": "votes", "type": "uint96" }, - { "internalType": "enum IGovernanceVoting.VoteType", "name": "voteType", "type": "uint8" } - ], - "internalType": "struct IGovernanceState.Receipt", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], - "name": "getVotingPower", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "governanceParameters", - "outputs": [ - { - "components": [ - { - "components": [ - { "internalType": "address", "name": "strategy", "type": "address" }, - { "internalType": "uint256", "name": "proposalThreshold", "type": "uint256" }, - { "internalType": "uint256", "name": "quorumThreshold", "type": "uint256" }, - { "internalType": "enum IGovernanceState.TimeType", "name": "timeType", "type": "uint8" } - ], - "internalType": "struct IGovernanceState.GovernanceParameters", - "name": "params", - "type": "tuple" - }, - { "internalType": "string", "name": "name", "type": "string" }, - { "internalType": "string", "name": "version", "type": "string" } - ], - "internalType": "struct IGovernanceState.EnhancedParams", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { "inputs": [], "name": "initializeGovernance", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "proposalCount", - "outputs": [{ "internalType": "uint256", "name": "count", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "proposals", - "outputs": [ - { - "components": [ - { - "components": [ - { "internalType": "uint256", "name": "actionsLength", "type": "uint256" }, - { "internalType": "uint256", "name": "startBlockOrTime", "type": "uint256" }, - { "internalType": "uint256", "name": "endBlockOrTime", "type": "uint256" }, - { "internalType": "uint256", "name": "votesFor", "type": "uint256" }, - { "internalType": "uint256", "name": "votesAgainst", "type": "uint256" }, - { "internalType": "uint256", "name": "votesAbstain", "type": "uint256" }, - { "internalType": "bool", "name": "executed", "type": "bool" } - ], - "internalType": "struct IGovernanceState.Proposal", - "name": "proposal", - "type": "tuple" - }, - { - "components": [ - { "internalType": "address", "name": "target", "type": "address" }, - { "internalType": "bytes", "name": "data", "type": "bytes" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "internalType": "struct IGovernanceVoting.ProposedAction[]", - "name": "proposedAction", - "type": "tuple[]" - } - ], - "internalType": "struct IGovernanceState.ProposalWrapper[]", - "name": "proposalWrapper", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "address", "name": "target", "type": "address" }, - { "internalType": "bytes", "name": "data", "type": "bytes" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "internalType": "struct IGovernanceVoting.ProposedAction[]", - "name": "actions", - "type": "tuple[]" - }, - { "internalType": "string", "name": "description", "type": "string" } - ], - "name": "propose", - "outputs": [{ "internalType": "uint256", "name": "proposalId", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "newProposalThreshold", "type": "uint256" }, - { "internalType": "uint256", "name": "newQuorumThreshold", "type": "uint256" } - ], - "name": "updateThresholds", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newImplementation", "type": "address" }], - "name": "upgradeImplementation", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newStrategy", "type": "address" }], - "name": "upgradeStrategy", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "votingPeriod", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - } -] diff --git a/src/apps/rigoblock/contracts/abis/grg-vault.json b/src/apps/rigoblock/contracts/abis/grg-vault.json deleted file mode 100644 index 090d7d438..000000000 --- a/src/apps/rigoblock/contracts/abis/grg-vault.json +++ /dev/null @@ -1,215 +0,0 @@ -[ - { - "inputs": [ - { "internalType": "address", "name": "_grgProxyAddress", "type": "address" }, - { "internalType": "address", "name": "_grgTokenAddress", "type": "address" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "target", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "caller", "type": "address" } - ], - "name": "AuthorizedAddressAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "target", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "caller", "type": "address" } - ], - "name": "AuthorizedAddressRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "staker", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "Deposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "grgProxyAddress", "type": "address" }], - "name": "GrgProxySet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "sender", "type": "address" }], - "name": "InCatastrophicFailureMode", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "stakingProxyAddress", "type": "address" }], - "name": "StakingProxySet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "staker", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "Withdraw", - "type": "event" - }, - { - "inputs": [{ "internalType": "address", "name": "target", "type": "address" }], - "name": "addAuthorizedAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "name": "authorities", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "authorized", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "staker", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "balanceOfGrgVault", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "staker", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "depositFrom", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "enterCatastrophicFailure", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getAuthorizedAddresses", - "outputs": [{ "internalType": "address[]", "name": "", "type": "address[]" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "grgAssetProxy", - "outputs": [{ "internalType": "contract IAssetProxy", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "isInCatastrophicFailure", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "target", "type": "address" }], - "name": "removeAuthorizedAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "target", "type": "address" }, - { "internalType": "uint256", "name": "index", "type": "uint256" } - ], - "name": "removeAuthorizedAddressAtIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_grgProxyAddress", "type": "address" }], - "name": "setGrgProxy", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_stakingProxyAddress", "type": "address" }], - "name": "setStakingProxy", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "stakingProxyAddress", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "staker", "type": "address" }], - "name": "withdrawAllFrom", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "staker", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "withdrawFrom", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/rigoblock/contracts/abis/pool-registry.json b/src/apps/rigoblock/contracts/abis/pool-registry.json deleted file mode 100644 index 3fd7e1f4a..000000000 --- a/src/apps/rigoblock/contracts/abis/pool-registry.json +++ /dev/null @@ -1,112 +0,0 @@ -[ - { - "inputs": [ - { "internalType": "address", "name": "newAuthority", "type": "address" }, - { "internalType": "address", "name": "newRigoblockDao", "type": "address" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [{ "indexed": true, "internalType": "address", "name": "authority", "type": "address" }], - "name": "AuthorityChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "pool", "type": "address" }, - { "indexed": true, "internalType": "bytes32", "name": "key", "type": "bytes32" }, - { "indexed": false, "internalType": "bytes32", "name": "value", "type": "bytes32" } - ], - "name": "MetaChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "group", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "pool", "type": "address" }, - { "indexed": true, "internalType": "bytes32", "name": "name", "type": "bytes32" }, - { "indexed": true, "internalType": "bytes32", "name": "symbol", "type": "bytes32" }, - { "indexed": false, "internalType": "bytes32", "name": "id", "type": "bytes32" } - ], - "name": "Registered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": true, "internalType": "address", "name": "rigoblockDao", "type": "address" }], - "name": "RigoblockDaoChanged", - "type": "event" - }, - { - "inputs": [], - "name": "authority", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "pool", "type": "address" }, - { "internalType": "bytes32", "name": "key", "type": "bytes32" } - ], - "name": "getMeta", - "outputs": [{ "internalType": "bytes32", "name": "poolMeta", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "pool", "type": "address" }], - "name": "getPoolIdFromAddress", - "outputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "pool", "type": "address" }, - { "internalType": "string", "name": "name", "type": "string" }, - { "internalType": "string", "name": "symbol", "type": "string" }, - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" } - ], - "name": "register", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rigoblockDao", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newAuthority", "type": "address" }], - "name": "setAuthority", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "pool", "type": "address" }, - { "internalType": "bytes32", "name": "key", "type": "bytes32" }, - { "internalType": "bytes32", "name": "value", "type": "bytes32" } - ], - "name": "setMeta", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newRigoblockDao", "type": "address" }], - "name": "setRigoblockDao", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/rigoblock/contracts/abis/smart-pool.json b/src/apps/rigoblock/contracts/abis/smart-pool.json deleted file mode 100644 index 9b57e50ad..000000000 --- a/src/apps/rigoblock/contracts/abis/smart-pool.json +++ /dev/null @@ -1,407 +0,0 @@ -[ - { - "inputs": [{ "internalType": "address", "name": "authority", "type": "address" }], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "pool", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "kycProvider", "type": "address" } - ], - "name": "KycProviderSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "pool", "type": "address" }, - { "indexed": false, "internalType": "uint48", "name": "minimumPeriod", "type": "uint48" } - ], - "name": "MinimumPeriodChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "pool", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "who", "type": "address" }, - { "indexed": false, "internalType": "address", "name": "feeCollector", "type": "address" } - ], - "name": "NewCollector", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "pool", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "who", "type": "address" }, - { "indexed": false, "internalType": "uint16", "name": "transactionFee", "type": "uint16" } - ], - "name": "NewFee", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "poolOperator", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "pool", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "unitaryValue", "type": "uint256" } - ], - "name": "NewNav", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "old", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "current", "type": "address" } - ], - "name": "NewOwner", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "group", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "baseToken", "type": "address" }, - { "indexed": false, "internalType": "string", "name": "name", "type": "string" }, - { "indexed": false, "internalType": "bytes8", "name": "symbol", "type": "bytes8" } - ], - "name": "PoolInitialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "pool", "type": "address" }, - { "indexed": false, "internalType": "uint16", "name": "spread", "type": "uint16" } - ], - "name": "SpreadChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { "stateMutability": "payable", "type": "fallback" }, - { - "inputs": [], - "name": "VERSION", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "internalType": "bool", "name": "success", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "authority", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "who", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, - { "internalType": "uint256", "name": "amountOutMin", "type": "uint256" } - ], - "name": "burn", - "outputs": [{ "internalType": "uint256", "name": "netRevenue", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "feeCollector", "type": "address" }], - "name": "changeFeeCollector", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint48", "name": "minPeriod", "type": "uint48" }], - "name": "changeMinPeriod", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint16", "name": "newSpread", "type": "uint16" }], - "name": "changeSpread", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getPool", - "outputs": [ - { - "components": [ - { "internalType": "string", "name": "name", "type": "string" }, - { "internalType": "string", "name": "symbol", "type": "string" }, - { "internalType": "uint8", "name": "decimals", "type": "uint8" }, - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "baseToken", "type": "address" } - ], - "internalType": "struct IRigoblockV3PoolState.ReturnedPool", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getPoolParams", - "outputs": [ - { - "components": [ - { "internalType": "uint48", "name": "minPeriod", "type": "uint48" }, - { "internalType": "uint16", "name": "spread", "type": "uint16" }, - { "internalType": "uint16", "name": "transactionFee", "type": "uint16" }, - { "internalType": "address", "name": "feeCollector", "type": "address" }, - { "internalType": "address", "name": "kycProvider", "type": "address" } - ], - "internalType": "struct IRigoblockV3PoolState.PoolParams", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getPoolStorage", - "outputs": [ - { - "components": [ - { "internalType": "string", "name": "name", "type": "string" }, - { "internalType": "string", "name": "symbol", "type": "string" }, - { "internalType": "uint8", "name": "decimals", "type": "uint8" }, - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "baseToken", "type": "address" } - ], - "internalType": "struct IRigoblockV3PoolState.ReturnedPool", - "name": "poolInitParams", - "type": "tuple" - }, - { - "components": [ - { "internalType": "uint48", "name": "minPeriod", "type": "uint48" }, - { "internalType": "uint16", "name": "spread", "type": "uint16" }, - { "internalType": "uint16", "name": "transactionFee", "type": "uint16" }, - { "internalType": "address", "name": "feeCollector", "type": "address" }, - { "internalType": "address", "name": "kycProvider", "type": "address" } - ], - "internalType": "struct IRigoblockV3PoolState.PoolParams", - "name": "poolVariables", - "type": "tuple" - }, - { - "components": [ - { "internalType": "uint256", "name": "unitaryValue", "type": "uint256" }, - { "internalType": "uint256", "name": "totalSupply", "type": "uint256" } - ], - "internalType": "struct IRigoblockV3PoolState.PoolTokens", - "name": "poolTokensInfo", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getPoolTokens", - "outputs": [ - { - "components": [ - { "internalType": "uint256", "name": "unitaryValue", "type": "uint256" }, - { "internalType": "uint256", "name": "totalSupply", "type": "uint256" } - ], - "internalType": "struct IRigoblockV3PoolState.PoolTokens", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "offset", "type": "uint256" }, - { "internalType": "uint256", "name": "length", "type": "uint256" } - ], - "name": "getStorageAt", - "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256[]", "name": "slots", "type": "uint256[]" }], - "name": "getStorageSlotsAt", - "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "who", "type": "address" }], - "name": "getUserAccount", - "outputs": [ - { - "components": [ - { "internalType": "uint208", "name": "userBalance", "type": "uint208" }, - { "internalType": "uint48", "name": "activation", "type": "uint48" } - ], - "internalType": "struct IRigoblockV3PoolState.UserAccount", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { "inputs": [], "name": "initializePool", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { "internalType": "address", "name": "recipient", "type": "address" }, - { "internalType": "uint256", "name": "amountIn", "type": "uint256" }, - { "internalType": "uint256", "name": "amountOutMin", "type": "uint256" } - ], - "name": "mint", - "outputs": [{ "internalType": "uint256", "name": "recipientAmount", "type": "uint256" }], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "kycProvider", "type": "address" }], - "name": "setKycProvider", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], - "name": "setOwner", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint16", "name": "transactionFee", "type": "uint16" }], - "name": "setTransactionFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "unitaryValue", "type": "uint256" }], - "name": "setUnitaryValue", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "success", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "success", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { "stateMutability": "payable", "type": "receive" } -] diff --git a/src/apps/rigoblock/contracts/abis/staking.json b/src/apps/rigoblock/contracts/abis/staking.json deleted file mode 100644 index 7697b647c..000000000 --- a/src/apps/rigoblock/contracts/abis/staking.json +++ /dev/null @@ -1,659 +0,0 @@ -[ - { - "inputs": [ - { "internalType": "address", "name": "grgVault", "type": "address" }, - { "internalType": "address", "name": "poolRegistry", "type": "address" }, - { "internalType": "address", "name": "rigoToken", "type": "address" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "target", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "caller", "type": "address" } - ], - "name": "AuthorizedAddressAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "target", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "caller", "type": "address" } - ], - "name": "AuthorizedAddressRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "string", "name": "reason", "type": "string" }], - "name": "CatchStringEvent", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "numPoolsToFinalize", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "rewardsAvailable", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "totalFeesCollected", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "totalWeightedStake", "type": "uint256" } - ], - "name": "EpochEnded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "rewardsPaid", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "rewardsRemaining", "type": "uint256" } - ], - "name": "EpochFinalized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "uint256", "name": "grgAmount", "type": "uint256" }], - "name": "GrgMintEvent", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "staker", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, - { "indexed": false, "internalType": "uint8", "name": "fromStatus", "type": "uint8" }, - { "indexed": true, "internalType": "bytes32", "name": "fromPool", "type": "bytes32" }, - { "indexed": false, "internalType": "uint8", "name": "toStatus", "type": "uint8" }, - { "indexed": true, "internalType": "bytes32", "name": "toPool", "type": "bytes32" } - ], - "name": "MoveStake", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "indexed": false, "internalType": "uint32", "name": "oldOperatorShare", "type": "uint32" }, - { "indexed": false, "internalType": "uint32", "name": "newOperatorShare", "type": "uint32" } - ], - "name": "OperatorShareDecreased", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "uint256", "name": "epochDurationInSeconds", "type": "uint256" }, - { "indexed": false, "internalType": "uint32", "name": "rewardDelegatedStakeWeight", "type": "uint32" }, - { "indexed": false, "internalType": "uint256", "name": "minimumPoolStake", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "cobbDouglasAlphaNumerator", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "cobbDouglasAlphaDenominator", "type": "uint256" } - ], - "name": "ParamsSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "exchangeAddress", "type": "address" }], - "name": "PopAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "address", "name": "exchangeAddress", "type": "address" }], - "name": "PopRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "rbPoolAddress", "type": "address" }, - { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" } - ], - "name": "RbPoolStakingPoolSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "bytes", "name": "reason", "type": "bytes" }], - "name": "ReturnDataEvent", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" }, - { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "indexed": false, "internalType": "uint256", "name": "operatorReward", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "membersReward", "type": "uint256" } - ], - "name": "RewardsPaid", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "staker", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "Stake", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "indexed": false, "internalType": "address", "name": "operator", "type": "address" }, - { "indexed": false, "internalType": "uint32", "name": "operatorShare", "type": "uint32" } - ], - "name": "StakingPoolCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "uint256", "name": "epoch", "type": "uint256" }, - { "indexed": true, "internalType": "bytes32", "name": "poolId", "type": "bytes32" } - ], - "name": "StakingPoolEarnedRewardsInEpoch", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "staker", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "Unstake", - "type": "event" - }, - { - "inputs": [{ "internalType": "address", "name": "target", "type": "address" }], - "name": "addAuthorizedAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "addr", "type": "address" }], - "name": "addPopAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "name": "aggregatedStatsByEpoch", - "outputs": [ - { "internalType": "uint256", "name": "rewardsAvailable", "type": "uint256" }, - { "internalType": "uint256", "name": "numPoolsToFinalize", "type": "uint256" }, - { "internalType": "uint256", "name": "totalFeesCollected", "type": "uint256" }, - { "internalType": "uint256", "name": "totalWeightedStake", "type": "uint256" }, - { "internalType": "uint256", "name": "totalRewardsFinalized", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "name": "authorities", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "authorized", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "cobbDouglasAlphaDenominator", - "outputs": [{ "internalType": "uint32", "name": "", "type": "uint32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "cobbDouglasAlphaNumerator", - "outputs": [{ "internalType": "uint32", "name": "", "type": "uint32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "internalType": "address", "name": "member", "type": "address" } - ], - "name": "computeRewardBalanceOfDelegator", - "outputs": [{ "internalType": "uint256", "name": "reward", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }], - "name": "computeRewardBalanceOfOperator", - "outputs": [{ "internalType": "uint256", "name": "reward", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "rigoblockPoolAddress", "type": "address" }], - "name": "createStakingPool", - "outputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "poolAccount", "type": "address" }, - { "internalType": "uint256", "name": "popReward", "type": "uint256" } - ], - "name": "creditPopReward", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "currentEpoch", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "currentEpochStartTimeInSeconds", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "internalType": "uint32", "name": "newOperatorShare", "type": "uint32" } - ], - "name": "decreaseStakingPoolOperatorShare", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "endEpoch", - "outputs": [{ "internalType": "uint256", "name": "numPoolsToFinalize", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "epochDurationInSeconds", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }], - "name": "finalizePool", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getAuthorizedAddresses", - "outputs": [{ "internalType": "address[]", "name": "", "type": "address[]" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getCurrentEpochEarliestEndTimeInSeconds", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "enum IStructs.StakeStatus", "name": "stakeStatus", "type": "uint8" }], - "name": "getGlobalStakeByStatus", - "outputs": [ - { - "components": [ - { "internalType": "uint64", "name": "currentEpoch", "type": "uint64" }, - { "internalType": "uint96", "name": "currentEpochBalance", "type": "uint96" }, - { "internalType": "uint96", "name": "nextEpochBalance", "type": "uint96" } - ], - "internalType": "struct IStructs.StoredBalance", - "name": "balance", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGrgContract", - "outputs": [{ "internalType": "contract IRigoToken", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getGrgVault", - "outputs": [{ "internalType": "contract IGrgVault", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "staker", "type": "address" }, - { "internalType": "enum IStructs.StakeStatus", "name": "stakeStatus", "type": "uint8" } - ], - "name": "getOwnerStakeByStatus", - "outputs": [ - { - "components": [ - { "internalType": "uint64", "name": "currentEpoch", "type": "uint64" }, - { "internalType": "uint96", "name": "currentEpochBalance", "type": "uint96" }, - { "internalType": "uint96", "name": "nextEpochBalance", "type": "uint96" } - ], - "internalType": "struct IStructs.StoredBalance", - "name": "balance", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getParams", - "outputs": [ - { "internalType": "uint256", "name": "_epochDurationInSeconds", "type": "uint256" }, - { "internalType": "uint32", "name": "_rewardDelegatedStakeWeight", "type": "uint32" }, - { "internalType": "uint256", "name": "_minimumPoolStake", "type": "uint256" }, - { "internalType": "uint32", "name": "_cobbDouglasAlphaNumerator", "type": "uint32" }, - { "internalType": "uint32", "name": "_cobbDouglasAlphaDenominator", "type": "uint32" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getPoolRegistry", - "outputs": [{ "internalType": "contract IPoolRegistry", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "staker", "type": "address" }, - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" } - ], - "name": "getStakeDelegatedToPoolByOwner", - "outputs": [ - { - "components": [ - { "internalType": "uint64", "name": "currentEpoch", "type": "uint64" }, - { "internalType": "uint96", "name": "currentEpochBalance", "type": "uint96" }, - { "internalType": "uint96", "name": "nextEpochBalance", "type": "uint96" } - ], - "internalType": "struct IStructs.StoredBalance", - "name": "balance", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }], - "name": "getStakingPool", - "outputs": [ - { - "components": [ - { "internalType": "address", "name": "operator", "type": "address" }, - { "internalType": "address", "name": "stakingPal", "type": "address" }, - { "internalType": "uint32", "name": "operatorShare", "type": "uint32" }, - { "internalType": "uint32", "name": "stakingPalShare", "type": "uint32" } - ], - "internalType": "struct IStructs.Pool", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }], - "name": "getStakingPoolStatsThisEpoch", - "outputs": [ - { - "components": [ - { "internalType": "uint256", "name": "feesCollected", "type": "uint256" }, - { "internalType": "uint256", "name": "weightedStake", "type": "uint256" }, - { "internalType": "uint256", "name": "membersStake", "type": "uint256" } - ], - "internalType": "struct IStructs.PoolStats", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "staker", "type": "address" }], - "name": "getTotalStake", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }], - "name": "getTotalStakeDelegatedToPool", - "outputs": [ - { - "components": [ - { "internalType": "uint64", "name": "currentEpoch", "type": "uint64" }, - { "internalType": "uint96", "name": "currentEpochBalance", "type": "uint96" }, - { "internalType": "uint96", "name": "nextEpochBalance", "type": "uint96" } - ], - "internalType": "struct IStructs.StoredBalance", - "name": "balance", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "grgReservedForPoolRewards", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { "inputs": [], "name": "init", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "minimumPoolStake", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { "internalType": "enum IStructs.StakeStatus", "name": "status", "type": "uint8" }, - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" } - ], - "internalType": "struct IStructs.StakeInfo", - "name": "from", - "type": "tuple" - }, - { - "components": [ - { "internalType": "enum IStructs.StakeStatus", "name": "status", "type": "uint8" }, - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" } - ], - "internalType": "struct IStructs.StakeInfo", - "name": "to", - "type": "tuple" - }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "moveStake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "poolIdByRbPoolAccount", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "", "type": "bytes32" }, - { "internalType": "uint256", "name": "", "type": "uint256" } - ], - "name": "poolStatsByEpoch", - "outputs": [ - { "internalType": "uint256", "name": "feesCollected", "type": "uint256" }, - { "internalType": "uint256", "name": "weightedStake", "type": "uint256" }, - { "internalType": "uint256", "name": "membersStake", "type": "uint256" } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "target", "type": "address" }], - "name": "removeAuthorizedAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "target", "type": "address" }, - { "internalType": "uint256", "name": "index", "type": "uint256" } - ], - "name": "removeAuthorizedAddressAtIndex", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "addr", "type": "address" }], - "name": "removePopAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardDelegatedStakeWeight", - "outputs": [{ "internalType": "uint32", "name": "", "type": "uint32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "name": "rewardsByPoolId", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "_epochDurationInSeconds", "type": "uint256" }, - { "internalType": "uint32", "name": "_rewardDelegatedStakeWeight", "type": "uint32" }, - { "internalType": "uint256", "name": "_minimumPoolStake", "type": "uint256" }, - { "internalType": "uint32", "name": "_cobbDouglasAlphaNumerator", "type": "uint32" }, - { "internalType": "uint32", "name": "_cobbDouglasAlphaDenominator", "type": "uint32" } - ], - "name": "setParams", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "poolId", "type": "bytes32" }, - { "internalType": "address", "name": "newStakingPalAddress", "type": "address" } - ], - "name": "setStakingPalAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "stake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "stakingContract", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "unstake", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "validPops", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "bytes32", "name": "poolId", "type": "bytes32" }], - "name": "withdrawDelegatorRewards", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/rigoblock/contracts/abis/token-whitelist.json b/src/apps/rigoblock/contracts/abis/token-whitelist.json deleted file mode 100644 index 7470857da..000000000 --- a/src/apps/rigoblock/contracts/abis/token-whitelist.json +++ /dev/null @@ -1,54 +0,0 @@ -[ - { - "inputs": [{ "internalType": "address", "name": "newAuthority", "type": "address" }], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "token", "type": "address" }, - { "indexed": false, "internalType": "bool", "name": "isWhitelisted", "type": "bool" } - ], - "name": "Whitelisted", - "type": "event" - }, - { - "inputs": [ - { "internalType": "address[]", "name": "tokens", "type": "address[]" }, - { "internalType": "bool[]", "name": "whitelisted", "type": "bool[]" } - ], - "name": "batchUpdateTokens", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getAuthority", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "token", "type": "address" }], - "name": "isWhitelistedToken", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "token", "type": "address" }], - "name": "removeToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "token", "type": "address" }], - "name": "whitelistToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/rigoblock/contracts/index.ts b/src/apps/rigoblock/contracts/index.ts deleted file mode 100644 index 5dcfebdf6..000000000 --- a/src/apps/rigoblock/contracts/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -export * from './viem.contract-factory'; diff --git a/src/apps/rigoblock/contracts/viem.contract-factory.ts b/src/apps/rigoblock/contracts/viem.contract-factory.ts deleted file mode 100644 index e1263d849..000000000 --- a/src/apps/rigoblock/contracts/viem.contract-factory.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Injectable, Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { Network } from '~types/network.interface'; - -import { - Governance__factory, - GrgVault__factory, - PoolRegistry__factory, - SmartPool__factory, - Staking__factory, - TokenWhitelist__factory, -} from './viem'; - -type ContractOpts = { address: string; network: Network }; - -@Injectable() -export class RigoblockViemContractFactory { - constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) {} - - governance({ address, network }: ContractOpts) { - return Governance__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - grgVault({ address, network }: ContractOpts) { - return GrgVault__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - poolRegistry({ address, network }: ContractOpts) { - return PoolRegistry__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - smartPool({ address, network }: ContractOpts) { - return SmartPool__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - staking({ address, network }: ContractOpts) { - return Staking__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - tokenWhitelist({ address, network }: ContractOpts) { - return TokenWhitelist__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } -} diff --git a/src/apps/rigoblock/contracts/viem/Governance.ts b/src/apps/rigoblock/contracts/viem/Governance.ts deleted file mode 100644 index bcb50aac0..000000000 --- a/src/apps/rigoblock/contracts/viem/Governance.ts +++ /dev/null @@ -1,696 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const governanceAbi = [ - { - inputs: [], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'proposer', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'proposalId', - type: 'uint256', - }, - { - components: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'bytes', - name: 'data', - type: 'bytes', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - indexed: false, - internalType: 'struct IGovernanceVoting.ProposedAction[]', - name: 'actions', - type: 'tuple[]', - }, - { - indexed: false, - internalType: 'uint256', - name: 'startBlockOrTime', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'endBlockOrTime', - type: 'uint256', - }, - { - indexed: false, - internalType: 'string', - name: 'description', - type: 'string', - }, - ], - name: 'ProposalCreated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'proposalId', - type: 'uint256', - }, - ], - name: 'ProposalExecuted', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'newStrategy', - type: 'address', - }, - ], - name: 'StrategyUpgraded', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'proposalThreshold', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'quorumThreshold', - type: 'uint256', - }, - ], - name: 'ThresholdsUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newImplementation', - type: 'address', - }, - ], - name: 'Upgraded', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'voter', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'proposalId', - type: 'uint256', - }, - { - indexed: false, - internalType: 'enum IGovernanceVoting.VoteType', - name: 'voteType', - type: 'uint8', - }, - { - indexed: false, - internalType: 'uint256', - name: 'votingPower', - type: 'uint256', - }, - ], - name: 'VoteCast', - type: 'event', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'proposalId', - type: 'uint256', - }, - { - internalType: 'enum IGovernanceVoting.VoteType', - name: 'voteType', - type: 'uint8', - }, - ], - name: 'castVote', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'proposalId', - type: 'uint256', - }, - { - internalType: 'enum IGovernanceVoting.VoteType', - name: 'voteType', - type: 'uint8', - }, - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - ], - name: 'castVoteBySignature', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'proposalId', - type: 'uint256', - }, - ], - name: 'execute', - outputs: [], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'proposalId', - type: 'uint256', - }, - ], - name: 'getActions', - outputs: [ - { - components: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'bytes', - name: 'data', - type: 'bytes', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - internalType: 'struct IGovernanceVoting.ProposedAction[]', - name: 'proposedActions', - type: 'tuple[]', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'proposalId', - type: 'uint256', - }, - ], - name: 'getProposalById', - outputs: [ - { - components: [ - { - components: [ - { - internalType: 'uint256', - name: 'actionsLength', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'startBlockOrTime', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'endBlockOrTime', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'votesFor', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'votesAgainst', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'votesAbstain', - type: 'uint256', - }, - { - internalType: 'bool', - name: 'executed', - type: 'bool', - }, - ], - internalType: 'struct IGovernanceState.Proposal', - name: 'proposal', - type: 'tuple', - }, - { - components: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'bytes', - name: 'data', - type: 'bytes', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - internalType: 'struct IGovernanceVoting.ProposedAction[]', - name: 'proposedAction', - type: 'tuple[]', - }, - ], - internalType: 'struct IGovernanceState.ProposalWrapper', - name: 'proposalWrapper', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'proposalId', - type: 'uint256', - }, - ], - name: 'getProposalState', - outputs: [ - { - internalType: 'enum IGovernanceState.ProposalState', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'proposalId', - type: 'uint256', - }, - { - internalType: 'address', - name: 'voter', - type: 'address', - }, - ], - name: 'getReceipt', - outputs: [ - { - components: [ - { - internalType: 'bool', - name: 'hasVoted', - type: 'bool', - }, - { - internalType: 'uint96', - name: 'votes', - type: 'uint96', - }, - { - internalType: 'enum IGovernanceVoting.VoteType', - name: 'voteType', - type: 'uint8', - }, - ], - internalType: 'struct IGovernanceState.Receipt', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'getVotingPower', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'governanceParameters', - outputs: [ - { - components: [ - { - components: [ - { - internalType: 'address', - name: 'strategy', - type: 'address', - }, - { - internalType: 'uint256', - name: 'proposalThreshold', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'quorumThreshold', - type: 'uint256', - }, - { - internalType: 'enum IGovernanceState.TimeType', - name: 'timeType', - type: 'uint8', - }, - ], - internalType: 'struct IGovernanceState.GovernanceParameters', - name: 'params', - type: 'tuple', - }, - { - internalType: 'string', - name: 'name', - type: 'string', - }, - { - internalType: 'string', - name: 'version', - type: 'string', - }, - ], - internalType: 'struct IGovernanceState.EnhancedParams', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'initializeGovernance', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'proposalCount', - outputs: [ - { - internalType: 'uint256', - name: 'count', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'proposals', - outputs: [ - { - components: [ - { - components: [ - { - internalType: 'uint256', - name: 'actionsLength', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'startBlockOrTime', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'endBlockOrTime', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'votesFor', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'votesAgainst', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'votesAbstain', - type: 'uint256', - }, - { - internalType: 'bool', - name: 'executed', - type: 'bool', - }, - ], - internalType: 'struct IGovernanceState.Proposal', - name: 'proposal', - type: 'tuple', - }, - { - components: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'bytes', - name: 'data', - type: 'bytes', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - internalType: 'struct IGovernanceVoting.ProposedAction[]', - name: 'proposedAction', - type: 'tuple[]', - }, - ], - internalType: 'struct IGovernanceState.ProposalWrapper[]', - name: 'proposalWrapper', - type: 'tuple[]', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'bytes', - name: 'data', - type: 'bytes', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - internalType: 'struct IGovernanceVoting.ProposedAction[]', - name: 'actions', - type: 'tuple[]', - }, - { - internalType: 'string', - name: 'description', - type: 'string', - }, - ], - name: 'propose', - outputs: [ - { - internalType: 'uint256', - name: 'proposalId', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'newProposalThreshold', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'newQuorumThreshold', - type: 'uint256', - }, - ], - name: 'updateThresholds', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newImplementation', - type: 'address', - }, - ], - name: 'upgradeImplementation', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newStrategy', - type: 'address', - }, - ], - name: 'upgradeStrategy', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'votingPeriod', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, -] as const; - -export type Governance = typeof governanceAbi; -export type GovernanceContract = GetContractReturnType; - -export class Governance__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: governanceAbi, publicClient: client }); - } -} diff --git a/src/apps/rigoblock/contracts/viem/GrgVault.ts b/src/apps/rigoblock/contracts/viem/GrgVault.ts deleted file mode 100644 index 48319876a..000000000 --- a/src/apps/rigoblock/contracts/viem/GrgVault.ts +++ /dev/null @@ -1,446 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const grgVaultAbi = [ - { - inputs: [ - { - internalType: 'address', - name: '_grgProxyAddress', - type: 'address', - }, - { - internalType: 'address', - name: '_grgTokenAddress', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'target', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - ], - name: 'AuthorizedAddressAdded', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'target', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - ], - name: 'AuthorizedAddressRemoved', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'staker', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Deposit', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'grgProxyAddress', - type: 'address', - }, - ], - name: 'GrgProxySet', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'sender', - type: 'address', - }, - ], - name: 'InCatastrophicFailureMode', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'previousOwner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnershipTransferred', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'stakingProxyAddress', - type: 'address', - }, - ], - name: 'StakingProxySet', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'staker', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Withdraw', - type: 'event', - }, - { - inputs: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - ], - name: 'addAuthorizedAddress', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'authorities', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'authorized', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'staker', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'balanceOfGrgVault', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'staker', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'depositFrom', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'enterCatastrophicFailure', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'getAuthorizedAddresses', - outputs: [ - { - internalType: 'address[]', - name: '', - type: 'address[]', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'grgAssetProxy', - outputs: [ - { - internalType: 'contract IAssetProxy', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'isInCatastrophicFailure', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'owner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - ], - name: 'removeAuthorizedAddress', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - ], - name: 'removeAuthorizedAddressAtIndex', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_grgProxyAddress', - type: 'address', - }, - ], - name: 'setGrgProxy', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_stakingProxyAddress', - type: 'address', - }, - ], - name: 'setStakingProxy', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'stakingProxyAddress', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'transferOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'staker', - type: 'address', - }, - ], - name: 'withdrawAllFrom', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'staker', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'withdrawFrom', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type GrgVault = typeof grgVaultAbi; -export type GrgVaultContract = GetContractReturnType; - -export class GrgVault__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: grgVaultAbi, publicClient: client }); - } -} diff --git a/src/apps/rigoblock/contracts/viem/PoolRegistry.ts b/src/apps/rigoblock/contracts/viem/PoolRegistry.ts deleted file mode 100644 index 6e2178377..000000000 --- a/src/apps/rigoblock/contracts/viem/PoolRegistry.ts +++ /dev/null @@ -1,266 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const poolRegistryAbi = [ - { - inputs: [ - { - internalType: 'address', - name: 'newAuthority', - type: 'address', - }, - { - internalType: 'address', - name: 'newRigoblockDao', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'authority', - type: 'address', - }, - ], - name: 'AuthorityChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'pool', - type: 'address', - }, - { - indexed: true, - internalType: 'bytes32', - name: 'key', - type: 'bytes32', - }, - { - indexed: false, - internalType: 'bytes32', - name: 'value', - type: 'bytes32', - }, - ], - name: 'MetaChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'group', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: 'pool', - type: 'address', - }, - { - indexed: true, - internalType: 'bytes32', - name: 'name', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'bytes32', - name: 'symbol', - type: 'bytes32', - }, - { - indexed: false, - internalType: 'bytes32', - name: 'id', - type: 'bytes32', - }, - ], - name: 'Registered', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'rigoblockDao', - type: 'address', - }, - ], - name: 'RigoblockDaoChanged', - type: 'event', - }, - { - inputs: [], - name: 'authority', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'pool', - type: 'address', - }, - { - internalType: 'bytes32', - name: 'key', - type: 'bytes32', - }, - ], - name: 'getMeta', - outputs: [ - { - internalType: 'bytes32', - name: 'poolMeta', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'pool', - type: 'address', - }, - ], - name: 'getPoolIdFromAddress', - outputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'pool', - type: 'address', - }, - { - internalType: 'string', - name: 'name', - type: 'string', - }, - { - internalType: 'string', - name: 'symbol', - type: 'string', - }, - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - ], - name: 'register', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'rigoblockDao', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newAuthority', - type: 'address', - }, - ], - name: 'setAuthority', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'pool', - type: 'address', - }, - { - internalType: 'bytes32', - name: 'key', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 'value', - type: 'bytes32', - }, - ], - name: 'setMeta', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newRigoblockDao', - type: 'address', - }, - ], - name: 'setRigoblockDao', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type PoolRegistry = typeof poolRegistryAbi; -export type PoolRegistryContract = GetContractReturnType; - -export class PoolRegistry__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: poolRegistryAbi, publicClient: client }); - } -} diff --git a/src/apps/rigoblock/contracts/viem/SmartPool.ts b/src/apps/rigoblock/contracts/viem/SmartPool.ts deleted file mode 100644 index 0421e4fdd..000000000 --- a/src/apps/rigoblock/contracts/viem/SmartPool.ts +++ /dev/null @@ -1,903 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const smartPoolAbi = [ - { - inputs: [ - { - internalType: 'address', - name: 'authority', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'pool', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'kycProvider', - type: 'address', - }, - ], - name: 'KycProviderSet', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'pool', - type: 'address', - }, - { - indexed: false, - internalType: 'uint48', - name: 'minimumPeriod', - type: 'uint48', - }, - ], - name: 'MinimumPeriodChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'pool', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'who', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: 'feeCollector', - type: 'address', - }, - ], - name: 'NewCollector', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'pool', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'who', - type: 'address', - }, - { - indexed: false, - internalType: 'uint16', - name: 'transactionFee', - type: 'uint16', - }, - ], - name: 'NewFee', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'poolOperator', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'pool', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'unitaryValue', - type: 'uint256', - }, - ], - name: 'NewNav', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'old', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'current', - type: 'address', - }, - ], - name: 'NewOwner', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'group', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'baseToken', - type: 'address', - }, - { - indexed: false, - internalType: 'string', - name: 'name', - type: 'string', - }, - { - indexed: false, - internalType: 'bytes8', - name: 'symbol', - type: 'bytes8', - }, - ], - name: 'PoolInitialized', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'pool', - type: 'address', - }, - { - indexed: false, - internalType: 'uint16', - name: 'spread', - type: 'uint16', - }, - ], - name: 'SpreadChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - stateMutability: 'payable', - type: 'fallback', - }, - { - inputs: [], - name: 'VERSION', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: 'success', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'authority', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'who', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amountIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'amountOutMin', - type: 'uint256', - }, - ], - name: 'burn', - outputs: [ - { - internalType: 'uint256', - name: 'netRevenue', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'feeCollector', - type: 'address', - }, - ], - name: 'changeFeeCollector', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint48', - name: 'minPeriod', - type: 'uint48', - }, - ], - name: 'changeMinPeriod', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint16', - name: 'newSpread', - type: 'uint16', - }, - ], - name: 'changeSpread', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getPool', - outputs: [ - { - components: [ - { - internalType: 'string', - name: 'name', - type: 'string', - }, - { - internalType: 'string', - name: 'symbol', - type: 'string', - }, - { - internalType: 'uint8', - name: 'decimals', - type: 'uint8', - }, - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'baseToken', - type: 'address', - }, - ], - internalType: 'struct IRigoblockV3PoolState.ReturnedPool', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getPoolParams', - outputs: [ - { - components: [ - { - internalType: 'uint48', - name: 'minPeriod', - type: 'uint48', - }, - { - internalType: 'uint16', - name: 'spread', - type: 'uint16', - }, - { - internalType: 'uint16', - name: 'transactionFee', - type: 'uint16', - }, - { - internalType: 'address', - name: 'feeCollector', - type: 'address', - }, - { - internalType: 'address', - name: 'kycProvider', - type: 'address', - }, - ], - internalType: 'struct IRigoblockV3PoolState.PoolParams', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getPoolStorage', - outputs: [ - { - components: [ - { - internalType: 'string', - name: 'name', - type: 'string', - }, - { - internalType: 'string', - name: 'symbol', - type: 'string', - }, - { - internalType: 'uint8', - name: 'decimals', - type: 'uint8', - }, - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'baseToken', - type: 'address', - }, - ], - internalType: 'struct IRigoblockV3PoolState.ReturnedPool', - name: 'poolInitParams', - type: 'tuple', - }, - { - components: [ - { - internalType: 'uint48', - name: 'minPeriod', - type: 'uint48', - }, - { - internalType: 'uint16', - name: 'spread', - type: 'uint16', - }, - { - internalType: 'uint16', - name: 'transactionFee', - type: 'uint16', - }, - { - internalType: 'address', - name: 'feeCollector', - type: 'address', - }, - { - internalType: 'address', - name: 'kycProvider', - type: 'address', - }, - ], - internalType: 'struct IRigoblockV3PoolState.PoolParams', - name: 'poolVariables', - type: 'tuple', - }, - { - components: [ - { - internalType: 'uint256', - name: 'unitaryValue', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalSupply', - type: 'uint256', - }, - ], - internalType: 'struct IRigoblockV3PoolState.PoolTokens', - name: 'poolTokensInfo', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getPoolTokens', - outputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'unitaryValue', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalSupply', - type: 'uint256', - }, - ], - internalType: 'struct IRigoblockV3PoolState.PoolTokens', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'offset', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'length', - type: 'uint256', - }, - ], - name: 'getStorageAt', - outputs: [ - { - internalType: 'bytes', - name: '', - type: 'bytes', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256[]', - name: 'slots', - type: 'uint256[]', - }, - ], - name: 'getStorageSlotsAt', - outputs: [ - { - internalType: 'bytes', - name: '', - type: 'bytes', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'who', - type: 'address', - }, - ], - name: 'getUserAccount', - outputs: [ - { - components: [ - { - internalType: 'uint208', - name: 'userBalance', - type: 'uint208', - }, - { - internalType: 'uint48', - name: 'activation', - type: 'uint48', - }, - ], - internalType: 'struct IRigoblockV3PoolState.UserAccount', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'initializePool', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amountIn', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'amountOutMin', - type: 'uint256', - }, - ], - name: 'mint', - outputs: [ - { - internalType: 'uint256', - name: 'recipientAmount', - type: 'uint256', - }, - ], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'owner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'kycProvider', - type: 'address', - }, - ], - name: 'setKycProvider', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'setOwner', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint16', - name: 'transactionFee', - type: 'uint16', - }, - ], - name: 'setTransactionFee', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'unitaryValue', - type: 'uint256', - }, - ], - name: 'setUnitaryValue', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: 'success', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: 'success', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - stateMutability: 'payable', - type: 'receive', - }, -] as const; - -export type SmartPool = typeof smartPoolAbi; -export type SmartPoolContract = GetContractReturnType; - -export class SmartPool__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: smartPoolAbi, publicClient: client }); - } -} diff --git a/src/apps/rigoblock/contracts/viem/Staking.ts b/src/apps/rigoblock/contracts/viem/Staking.ts deleted file mode 100644 index 7988f6528..000000000 --- a/src/apps/rigoblock/contracts/viem/Staking.ts +++ /dev/null @@ -1,1455 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const stakingAbi = [ - { - inputs: [ - { - internalType: 'address', - name: 'grgVault', - type: 'address', - }, - { - internalType: 'address', - name: 'poolRegistry', - type: 'address', - }, - { - internalType: 'address', - name: 'rigoToken', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'target', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - ], - name: 'AuthorizedAddressAdded', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'target', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - ], - name: 'AuthorizedAddressRemoved', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'string', - name: 'reason', - type: 'string', - }, - ], - name: 'CatchStringEvent', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'numPoolsToFinalize', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'rewardsAvailable', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'totalFeesCollected', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'totalWeightedStake', - type: 'uint256', - }, - ], - name: 'EpochEnded', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'rewardsPaid', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'rewardsRemaining', - type: 'uint256', - }, - ], - name: 'EpochFinalized', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'grgAmount', - type: 'uint256', - }, - ], - name: 'GrgMintEvent', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'staker', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint8', - name: 'fromStatus', - type: 'uint8', - }, - { - indexed: true, - internalType: 'bytes32', - name: 'fromPool', - type: 'bytes32', - }, - { - indexed: false, - internalType: 'uint8', - name: 'toStatus', - type: 'uint8', - }, - { - indexed: true, - internalType: 'bytes32', - name: 'toPool', - type: 'bytes32', - }, - ], - name: 'MoveStake', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - indexed: false, - internalType: 'uint32', - name: 'oldOperatorShare', - type: 'uint32', - }, - { - indexed: false, - internalType: 'uint32', - name: 'newOperatorShare', - type: 'uint32', - }, - ], - name: 'OperatorShareDecreased', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'previousOwner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnershipTransferred', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'epochDurationInSeconds', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint32', - name: 'rewardDelegatedStakeWeight', - type: 'uint32', - }, - { - indexed: false, - internalType: 'uint256', - name: 'minimumPoolStake', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'cobbDouglasAlphaNumerator', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'cobbDouglasAlphaDenominator', - type: 'uint256', - }, - ], - name: 'ParamsSet', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'exchangeAddress', - type: 'address', - }, - ], - name: 'PopAdded', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'exchangeAddress', - type: 'address', - }, - ], - name: 'PopRemoved', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'rbPoolAddress', - type: 'address', - }, - { - indexed: true, - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - ], - name: 'RbPoolStakingPoolSet', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'bytes', - name: 'reason', - type: 'bytes', - }, - ], - name: 'ReturnDataEvent', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - indexed: true, - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - indexed: false, - internalType: 'uint256', - name: 'operatorReward', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'membersReward', - type: 'uint256', - }, - ], - name: 'RewardsPaid', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'staker', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Stake', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - indexed: false, - internalType: 'address', - name: 'operator', - type: 'address', - }, - { - indexed: false, - internalType: 'uint32', - name: 'operatorShare', - type: 'uint32', - }, - ], - name: 'StakingPoolCreated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'epoch', - type: 'uint256', - }, - { - indexed: true, - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - ], - name: 'StakingPoolEarnedRewardsInEpoch', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'staker', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Unstake', - type: 'event', - }, - { - inputs: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - ], - name: 'addAuthorizedAddress', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'addr', - type: 'address', - }, - ], - name: 'addPopAddress', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'aggregatedStatsByEpoch', - outputs: [ - { - internalType: 'uint256', - name: 'rewardsAvailable', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'numPoolsToFinalize', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalFeesCollected', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalWeightedStake', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalRewardsFinalized', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'authorities', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'authorized', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'cobbDouglasAlphaDenominator', - outputs: [ - { - internalType: 'uint32', - name: '', - type: 'uint32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'cobbDouglasAlphaNumerator', - outputs: [ - { - internalType: 'uint32', - name: '', - type: 'uint32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'member', - type: 'address', - }, - ], - name: 'computeRewardBalanceOfDelegator', - outputs: [ - { - internalType: 'uint256', - name: 'reward', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - ], - name: 'computeRewardBalanceOfOperator', - outputs: [ - { - internalType: 'uint256', - name: 'reward', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'rigoblockPoolAddress', - type: 'address', - }, - ], - name: 'createStakingPool', - outputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'poolAccount', - type: 'address', - }, - { - internalType: 'uint256', - name: 'popReward', - type: 'uint256', - }, - ], - name: 'creditPopReward', - outputs: [], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [], - name: 'currentEpoch', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'currentEpochStartTimeInSeconds', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - internalType: 'uint32', - name: 'newOperatorShare', - type: 'uint32', - }, - ], - name: 'decreaseStakingPoolOperatorShare', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'endEpoch', - outputs: [ - { - internalType: 'uint256', - name: 'numPoolsToFinalize', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'epochDurationInSeconds', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - ], - name: 'finalizePool', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'getAuthorizedAddresses', - outputs: [ - { - internalType: 'address[]', - name: '', - type: 'address[]', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getCurrentEpochEarliestEndTimeInSeconds', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'enum IStructs.StakeStatus', - name: 'stakeStatus', - type: 'uint8', - }, - ], - name: 'getGlobalStakeByStatus', - outputs: [ - { - components: [ - { - internalType: 'uint64', - name: 'currentEpoch', - type: 'uint64', - }, - { - internalType: 'uint96', - name: 'currentEpochBalance', - type: 'uint96', - }, - { - internalType: 'uint96', - name: 'nextEpochBalance', - type: 'uint96', - }, - ], - internalType: 'struct IStructs.StoredBalance', - name: 'balance', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getGrgContract', - outputs: [ - { - internalType: 'contract IRigoToken', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getGrgVault', - outputs: [ - { - internalType: 'contract IGrgVault', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'staker', - type: 'address', - }, - { - internalType: 'enum IStructs.StakeStatus', - name: 'stakeStatus', - type: 'uint8', - }, - ], - name: 'getOwnerStakeByStatus', - outputs: [ - { - components: [ - { - internalType: 'uint64', - name: 'currentEpoch', - type: 'uint64', - }, - { - internalType: 'uint96', - name: 'currentEpochBalance', - type: 'uint96', - }, - { - internalType: 'uint96', - name: 'nextEpochBalance', - type: 'uint96', - }, - ], - internalType: 'struct IStructs.StoredBalance', - name: 'balance', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getParams', - outputs: [ - { - internalType: 'uint256', - name: '_epochDurationInSeconds', - type: 'uint256', - }, - { - internalType: 'uint32', - name: '_rewardDelegatedStakeWeight', - type: 'uint32', - }, - { - internalType: 'uint256', - name: '_minimumPoolStake', - type: 'uint256', - }, - { - internalType: 'uint32', - name: '_cobbDouglasAlphaNumerator', - type: 'uint32', - }, - { - internalType: 'uint32', - name: '_cobbDouglasAlphaDenominator', - type: 'uint32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getPoolRegistry', - outputs: [ - { - internalType: 'contract IPoolRegistry', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'staker', - type: 'address', - }, - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - ], - name: 'getStakeDelegatedToPoolByOwner', - outputs: [ - { - components: [ - { - internalType: 'uint64', - name: 'currentEpoch', - type: 'uint64', - }, - { - internalType: 'uint96', - name: 'currentEpochBalance', - type: 'uint96', - }, - { - internalType: 'uint96', - name: 'nextEpochBalance', - type: 'uint96', - }, - ], - internalType: 'struct IStructs.StoredBalance', - name: 'balance', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - ], - name: 'getStakingPool', - outputs: [ - { - components: [ - { - internalType: 'address', - name: 'operator', - type: 'address', - }, - { - internalType: 'address', - name: 'stakingPal', - type: 'address', - }, - { - internalType: 'uint32', - name: 'operatorShare', - type: 'uint32', - }, - { - internalType: 'uint32', - name: 'stakingPalShare', - type: 'uint32', - }, - ], - internalType: 'struct IStructs.Pool', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - ], - name: 'getStakingPoolStatsThisEpoch', - outputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'feesCollected', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'weightedStake', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'membersStake', - type: 'uint256', - }, - ], - internalType: 'struct IStructs.PoolStats', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'staker', - type: 'address', - }, - ], - name: 'getTotalStake', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - ], - name: 'getTotalStakeDelegatedToPool', - outputs: [ - { - components: [ - { - internalType: 'uint64', - name: 'currentEpoch', - type: 'uint64', - }, - { - internalType: 'uint96', - name: 'currentEpochBalance', - type: 'uint96', - }, - { - internalType: 'uint96', - name: 'nextEpochBalance', - type: 'uint96', - }, - ], - internalType: 'struct IStructs.StoredBalance', - name: 'balance', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'grgReservedForPoolRewards', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'init', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'minimumPoolStake', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - components: [ - { - internalType: 'enum IStructs.StakeStatus', - name: 'status', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - ], - internalType: 'struct IStructs.StakeInfo', - name: 'from', - type: 'tuple', - }, - { - components: [ - { - internalType: 'enum IStructs.StakeStatus', - name: 'status', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - ], - internalType: 'struct IStructs.StakeInfo', - name: 'to', - type: 'tuple', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'moveStake', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'owner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'poolIdByRbPoolAccount', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'poolStatsByEpoch', - outputs: [ - { - internalType: 'uint256', - name: 'feesCollected', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'weightedStake', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'membersStake', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - ], - name: 'removeAuthorizedAddress', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - ], - name: 'removeAuthorizedAddressAtIndex', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'addr', - type: 'address', - }, - ], - name: 'removePopAddress', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'rewardDelegatedStakeWeight', - outputs: [ - { - internalType: 'uint32', - name: '', - type: 'uint32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - name: 'rewardsByPoolId', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_epochDurationInSeconds', - type: 'uint256', - }, - { - internalType: 'uint32', - name: '_rewardDelegatedStakeWeight', - type: 'uint32', - }, - { - internalType: 'uint256', - name: '_minimumPoolStake', - type: 'uint256', - }, - { - internalType: 'uint32', - name: '_cobbDouglasAlphaNumerator', - type: 'uint32', - }, - { - internalType: 'uint32', - name: '_cobbDouglasAlphaDenominator', - type: 'uint32', - }, - ], - name: 'setParams', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'newStakingPalAddress', - type: 'address', - }, - ], - name: 'setStakingPalAddress', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'stake', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'stakingContract', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'transferOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'unstake', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'validPops', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'poolId', - type: 'bytes32', - }, - ], - name: 'withdrawDelegatorRewards', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type Staking = typeof stakingAbi; -export type StakingContract = GetContractReturnType; - -export class Staking__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: stakingAbi, publicClient: client }); - } -} diff --git a/src/apps/rigoblock/contracts/viem/TokenWhitelist.ts b/src/apps/rigoblock/contracts/viem/TokenWhitelist.ts deleted file mode 100644 index f014cc47f..000000000 --- a/src/apps/rigoblock/contracts/viem/TokenWhitelist.ts +++ /dev/null @@ -1,122 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const tokenWhitelistAbi = [ - { - inputs: [ - { - internalType: 'address', - name: 'newAuthority', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'token', - type: 'address', - }, - { - indexed: false, - internalType: 'bool', - name: 'isWhitelisted', - type: 'bool', - }, - ], - name: 'Whitelisted', - type: 'event', - }, - { - inputs: [ - { - internalType: 'address[]', - name: 'tokens', - type: 'address[]', - }, - { - internalType: 'bool[]', - name: 'whitelisted', - type: 'bool[]', - }, - ], - name: 'batchUpdateTokens', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'getAuthority', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - ], - name: 'isWhitelistedToken', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - ], - name: 'removeToken', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - ], - name: 'whitelistToken', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type TokenWhitelist = typeof tokenWhitelistAbi; -export type TokenWhitelistContract = GetContractReturnType; - -export class TokenWhitelist__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: tokenWhitelistAbi, publicClient: client }); - } -} diff --git a/src/apps/rigoblock/contracts/viem/index.ts b/src/apps/rigoblock/contracts/viem/index.ts deleted file mode 100644 index b720705e0..000000000 --- a/src/apps/rigoblock/contracts/viem/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ - -export type { Governance } from './Governance'; -export type { GrgVault } from './GrgVault'; -export type { PoolRegistry } from './PoolRegistry'; -export type { SmartPool } from './SmartPool'; -export type { Staking } from './Staking'; -export type { TokenWhitelist } from './TokenWhitelist'; - -export { Governance__factory } from './Governance'; -export { GrgVault__factory } from './GrgVault'; -export { PoolRegistry__factory } from './PoolRegistry'; -export { SmartPool__factory } from './SmartPool'; -export { Staking__factory } from './Staking'; -export { TokenWhitelist__factory } from './TokenWhitelist'; diff --git a/src/apps/rigoblock/ethereum/rigoblock.pool.contract-position-fetcher.ts b/src/apps/rigoblock/ethereum/rigoblock.pool.contract-position-fetcher.ts deleted file mode 100644 index 0f4776ba3..000000000 --- a/src/apps/rigoblock/ethereum/rigoblock.pool.contract-position-fetcher.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { RigoblockPoolContractPositionFetcher } from '../common/rigoblock.pool.contract-position-fetcher'; - -@PositionTemplate() -export class EthereumRigoblockPoolContractPositionFetcher extends RigoblockPoolContractPositionFetcher { - groupLabel = 'Smart Pools'; - - positionManagerAddress = '0xc36442b4a4522e871399cd717abdd847ab11fe88'; - factoryAddress = '0x1f98431c8ad98523631ae4a59f267346ea31f984'; -} diff --git a/src/apps/rigoblock/ethereum/rigoblock.pool.token-fetcher.ts b/src/apps/rigoblock/ethereum/rigoblock.pool.token-fetcher.ts deleted file mode 100644 index bcb52af11..000000000 --- a/src/apps/rigoblock/ethereum/rigoblock.pool.token-fetcher.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { RigoblockPoolTokenFetcher } from '../common/rigoblock.pool.token-fetcher'; - -@PositionTemplate() -export class EthereumRigoblockPoolTokenFetcher extends RigoblockPoolTokenFetcher { - groupLabel = 'Smart Pools'; -} diff --git a/src/apps/rigoblock/optimism/rigoblock.pool.contract-position-fetcher.ts b/src/apps/rigoblock/optimism/rigoblock.pool.contract-position-fetcher.ts deleted file mode 100644 index 22afefd5c..000000000 --- a/src/apps/rigoblock/optimism/rigoblock.pool.contract-position-fetcher.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { RigoblockPoolContractPositionFetcher } from '../common/rigoblock.pool.contract-position-fetcher'; - -@PositionTemplate() -export class OptimismRigoblockPoolContractPositionFetcher extends RigoblockPoolContractPositionFetcher { - groupLabel = 'Smart Pools'; - - positionManagerAddress = '0xc36442b4a4522e871399cd717abdd847ab11fe88'; - factoryAddress = '0x1f98431c8ad98523631ae4a59f267346ea31f984'; -} diff --git a/src/apps/rigoblock/optimism/rigoblock.pool.token-fetcher.ts b/src/apps/rigoblock/optimism/rigoblock.pool.token-fetcher.ts deleted file mode 100644 index c241adb6a..000000000 --- a/src/apps/rigoblock/optimism/rigoblock.pool.token-fetcher.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { RigoblockPoolTokenFetcher } from '../common/rigoblock.pool.token-fetcher'; - -@PositionTemplate() -export class OptimismRigoblockPoolTokenFetcher extends RigoblockPoolTokenFetcher { - groupLabel = 'Smart Pools'; -} diff --git a/src/apps/rigoblock/polygon/rigoblock.pool.contract-position-fetcher.ts b/src/apps/rigoblock/polygon/rigoblock.pool.contract-position-fetcher.ts deleted file mode 100644 index 51abfa283..000000000 --- a/src/apps/rigoblock/polygon/rigoblock.pool.contract-position-fetcher.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { RigoblockPoolContractPositionFetcher } from '../common/rigoblock.pool.contract-position-fetcher'; - -@PositionTemplate() -export class PolygonRigoblockPoolContractPositionFetcher extends RigoblockPoolContractPositionFetcher { - groupLabel = 'Smart Pools'; - - positionManagerAddress = '0xc36442b4a4522e871399cd717abdd847ab11fe88'; - factoryAddress = '0x1f98431c8ad98523631ae4a59f267346ea31f984'; -} diff --git a/src/apps/rigoblock/polygon/rigoblock.pool.token-fetcher.ts b/src/apps/rigoblock/polygon/rigoblock.pool.token-fetcher.ts deleted file mode 100644 index 13021912f..000000000 --- a/src/apps/rigoblock/polygon/rigoblock.pool.token-fetcher.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { RigoblockPoolTokenFetcher } from '../common/rigoblock.pool.token-fetcher'; - -@PositionTemplate() -export class PolygonRigoblockPoolTokenFetcher extends RigoblockPoolTokenFetcher { - groupLabel = 'Smart Pools'; -} diff --git a/src/apps/rigoblock/rigoblock.module.ts b/src/apps/rigoblock/rigoblock.module.ts deleted file mode 100644 index 04f32ee33..000000000 --- a/src/apps/rigoblock/rigoblock.module.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { AbstractApp } from '~app/app.dynamic-module'; -import { UniswapV3LiquidityContractPositionBuilder } from '~apps/uniswap-v3/common/uniswap-v3.liquidity.contract-position-builder'; -import { UniswapV3ViemContractFactory } from '~apps/uniswap-v3/contracts'; - -import { ArbitrumRigoblockPoolContractPositionFetcher } from './arbitrum/rigoblock.pool.contract-position-fetcher'; -import { ArbitrumRigoblockPoolTokenFetcher } from './arbitrum/rigoblock.pool.token-fetcher'; -import { RigoblockLogProvider } from './common/rigoblock.log-provider'; -import { RigoblockViemContractFactory } from './contracts'; -import { EthereumRigoblockPoolContractPositionFetcher } from './ethereum/rigoblock.pool.contract-position-fetcher'; -import { EthereumRigoblockPoolTokenFetcher } from './ethereum/rigoblock.pool.token-fetcher'; -import { OptimismRigoblockPoolContractPositionFetcher } from './optimism/rigoblock.pool.contract-position-fetcher'; -import { OptimismRigoblockPoolTokenFetcher } from './optimism/rigoblock.pool.token-fetcher'; -import { PolygonRigoblockPoolContractPositionFetcher } from './polygon/rigoblock.pool.contract-position-fetcher'; -import { PolygonRigoblockPoolTokenFetcher } from './polygon/rigoblock.pool.token-fetcher'; - -@Module({ - providers: [ - UniswapV3ViemContractFactory, - UniswapV3LiquidityContractPositionBuilder, - ArbitrumRigoblockPoolContractPositionFetcher, - ArbitrumRigoblockPoolTokenFetcher, - EthereumRigoblockPoolContractPositionFetcher, - EthereumRigoblockPoolTokenFetcher, - OptimismRigoblockPoolContractPositionFetcher, - OptimismRigoblockPoolTokenFetcher, - PolygonRigoblockPoolContractPositionFetcher, - PolygonRigoblockPoolTokenFetcher, - RigoblockViemContractFactory, - RigoblockLogProvider, - ], -}) -export class RigoblockAppModule extends AbstractApp() {} diff --git a/src/apps/stargate/arbitrum/stargate.eth.token-fetcher.ts b/src/apps/stargate/arbitrum/stargate.eth.token-fetcher.ts deleted file mode 100644 index 94904a291..000000000 --- a/src/apps/stargate/arbitrum/stargate.eth.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { StargateEthTokenFetcher } from '../common/stargate.eth.token-fetcher'; - -@PositionTemplate() -export class ArbitrumStargateEthTokenFetcher extends StargateEthTokenFetcher { - groupLabel = 'Wrapped'; - - stargateEthAddress = '0x915a55e36a01285a14f05de6e81ed9ce89772f8e'; -} diff --git a/src/apps/stargate/base/stargate.eth.token-fetcher.ts b/src/apps/stargate/base/stargate.eth.token-fetcher.ts deleted file mode 100644 index 23a95c59e..000000000 --- a/src/apps/stargate/base/stargate.eth.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { StargateEthTokenFetcher } from '../common/stargate.eth.token-fetcher'; - -@PositionTemplate() -export class BaseStargateEthTokenFetcher extends StargateEthTokenFetcher { - groupLabel = 'Wrapped'; - - stargateEthAddress = '0x224d8fd7ab6ad4c6eb4611ce56ef35dec2277f03'; -} diff --git a/src/apps/stargate/common/stargate.eth.token-fetcher.ts b/src/apps/stargate/common/stargate.eth.token-fetcher.ts deleted file mode 100644 index c5ae760ce..000000000 --- a/src/apps/stargate/common/stargate.eth.token-fetcher.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { ZERO_ADDRESS } from '~app-toolkit/constants/address'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; - -import { StargateViemContractFactory } from '../contracts'; -import { StargateEth } from '../contracts/viem'; - -export abstract class StargateEthTokenFetcher extends AppTokenTemplatePositionFetcher { - abstract stargateEthAddress: string; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(StargateViemContractFactory) protected readonly contractFactory: StargateViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.stargateEth({ address, network: this.network }); - } - - getAddresses() { - return [this.stargateEthAddress]; - } - - async getUnderlyingTokenDefinitions() { - return [{ address: ZERO_ADDRESS, network: this.network }]; - } - - async getPricePerShare() { - return [1]; - } -} diff --git a/src/apps/stargate/contracts/abis/stargate-eth.json b/src/apps/stargate/contracts/abis/stargate-eth.json deleted file mode 100644 index f9a93733c..000000000 --- a/src/apps/stargate/contracts/abis/stargate-eth.json +++ /dev/null @@ -1,395 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "src", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "guy", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "dst", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "Deposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "src", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "dst", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "src", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "dst", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "TransferNative", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "src", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "Withdrawal", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "guy", - "type": "address" - }, - { - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "deposit", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "noUnwrapTo", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - } - ], - "name": "setNoUnwrapTo", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "dst", - "type": "address" - }, - { - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "src", - "type": "address" - }, - { - "internalType": "address", - "name": "dst", - "type": "address" - }, - { - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "wad", - "type": "uint256" - } - ], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } -] diff --git a/src/apps/stargate/contracts/viem.contract-factory.ts b/src/apps/stargate/contracts/viem.contract-factory.ts index 9f1992a60..bd92b4454 100644 --- a/src/apps/stargate/contracts/viem.contract-factory.ts +++ b/src/apps/stargate/contracts/viem.contract-factory.ts @@ -6,7 +6,6 @@ import { Network } from '~types/network.interface'; import { StargateChef__factory, StargateChefTime__factory, - StargateEth__factory, StargateFactory__factory, StargatePool__factory, StargateVe__factory, @@ -24,9 +23,6 @@ export class StargateViemContractFactory { stargateChefTime({ address, network }: ContractOpts) { return StargateChefTime__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } - stargateEth({ address, network }: ContractOpts) { - return StargateEth__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } stargateFactory({ address, network }: ContractOpts) { return StargateFactory__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } diff --git a/src/apps/stargate/contracts/viem/StargateEth.ts b/src/apps/stargate/contracts/viem/StargateEth.ts deleted file mode 100644 index 5b54b5c16..000000000 --- a/src/apps/stargate/contracts/viem/StargateEth.ts +++ /dev/null @@ -1,409 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const stargateEthAbi = [ - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'src', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'guy', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'wad', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'dst', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'wad', - type: 'uint256', - }, - ], - name: 'Deposit', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'previousOwner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnershipTransferred', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'src', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'dst', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'wad', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'src', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'dst', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'wad', - type: 'uint256', - }, - ], - name: 'TransferNative', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'src', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'wad', - type: 'uint256', - }, - ], - name: 'Withdrawal', - type: 'event', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'guy', - type: 'address', - }, - { - internalType: 'uint256', - name: 'wad', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'deposit', - outputs: [], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'noUnwrapTo', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'owner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'renounceOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_addr', - type: 'address', - }, - ], - name: 'setNoUnwrapTo', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'dst', - type: 'address', - }, - { - internalType: 'uint256', - name: 'wad', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'src', - type: 'address', - }, - { - internalType: 'address', - name: 'dst', - type: 'address', - }, - { - internalType: 'uint256', - name: 'wad', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'transferOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'wad', - type: 'uint256', - }, - ], - name: 'withdraw', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - stateMutability: 'payable', - type: 'receive', - }, -] as const; - -export type StargateEth = typeof stargateEthAbi; -export type StargateEthContract = GetContractReturnType; - -export class StargateEth__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: stargateEthAbi, publicClient: client }); - } -} diff --git a/src/apps/stargate/contracts/viem/index.ts b/src/apps/stargate/contracts/viem/index.ts index 5217a3819..db9c6750f 100644 --- a/src/apps/stargate/contracts/viem/index.ts +++ b/src/apps/stargate/contracts/viem/index.ts @@ -4,14 +4,12 @@ export type { StargateChefTime } from './StargateChefTime'; export type { StargateChef } from './StargateChef'; -export type { StargateEth } from './StargateEth'; export type { StargateFactory } from './StargateFactory'; export type { StargatePool } from './StargatePool'; export type { StargateVe } from './StargateVe'; export { StargateChefTime__factory } from './StargateChefTime'; export { StargateChef__factory } from './StargateChef'; -export { StargateEth__factory } from './StargateEth'; export { StargateFactory__factory } from './StargateFactory'; export { StargatePool__factory } from './StargatePool'; export { StargateVe__factory } from './StargateVe'; diff --git a/src/apps/stargate/ethereum/stargate.eth.token-fetcher.ts b/src/apps/stargate/ethereum/stargate.eth.token-fetcher.ts deleted file mode 100644 index ef534d2f4..000000000 --- a/src/apps/stargate/ethereum/stargate.eth.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { StargateEthTokenFetcher } from '../common/stargate.eth.token-fetcher'; - -@PositionTemplate() -export class EthereumStargateEthTokenFetcher extends StargateEthTokenFetcher { - groupLabel = 'Wrapped'; - - stargateEthAddress = '0x72e2f4830b9e45d52f80ac08cb2bec0fef72ed9c'; -} diff --git a/src/apps/stargate/optimism/stargate.eth.token-fetcher.ts b/src/apps/stargate/optimism/stargate.eth.token-fetcher.ts deleted file mode 100644 index 6d8121452..000000000 --- a/src/apps/stargate/optimism/stargate.eth.token-fetcher.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { StargateEthTokenFetcher } from '../common/stargate.eth.token-fetcher'; - -@PositionTemplate() -export class OptimismStargateEthTokenFetcher extends StargateEthTokenFetcher { - groupLabel = 'Wrapped'; - - stargateEthAddress = '0xd22363e3762ca7339569f3d33eade20127d5f98c'; -} diff --git a/src/apps/stargate/stargate.module.ts b/src/apps/stargate/stargate.module.ts index adab735d8..a8be40509 100644 --- a/src/apps/stargate/stargate.module.ts +++ b/src/apps/stargate/stargate.module.ts @@ -2,7 +2,6 @@ import { Module } from '@nestjs/common'; import { AbstractApp } from '~app/app.dynamic-module'; -import { ArbitrumStargateEthTokenFetcher } from './arbitrum/stargate.eth.token-fetcher'; import { ArbitrumStargateFarmContractPositionFetcher } from './arbitrum/stargate.farm.contract-position-fetcher'; import { ArbitrumStargateLpStakingContractPositionFetcher } from './arbitrum/stargate.lp-staking.contract-position-fetcher'; import { ArbitrumStargatePoolTokenFetcher } from './arbitrum/stargate.pool.token-fetcher'; @@ -10,21 +9,18 @@ import { ArbitrumStargateVotingEscrowContractPositionFetcher } from './arbitrum/ import { AvalancheStargateFarmContractPositionFetcher } from './avalanche/stargate.farm.contract-position-fetcher'; import { AvalancheStargatePoolTokenFetcher } from './avalanche/stargate.pool.token-fetcher'; import { AvalancheStargateVotingEscrowContractPositionFetcher } from './avalanche/stargate.voting-escrow.contract-position-fetcher'; -import { BaseStargateEthTokenFetcher } from './base/stargate.eth.token-fetcher'; import { BaseStargateFarmContractPositionFetcher } from './base/stargate.farm.contract-position-fetcher'; import { BaseStargatePoolTokenFetcher } from './base/stargate.pool.token-fetcher'; import { BinanceSmartChainStargateFarmContractPositionFetcher } from './binance-smart-chain/stargate.farm.contract-position-fetcher'; import { BinanceSmartChainStargatePoolTokenFetcher } from './binance-smart-chain/stargate.pool.token-fetcher'; import { BinanceSmartChainStargateVotingEscrowContractPositionFetcher } from './binance-smart-chain/stargate.voting-escrow.contract-position-fetcher'; import { StargateViemContractFactory } from './contracts'; -import { EthereumStargateEthTokenFetcher } from './ethereum/stargate.eth.token-fetcher'; import { EthereumStargateFarmContractPositionFetcher } from './ethereum/stargate.farm.contract-position-fetcher'; import { EthereumStargatePoolTokenFetcher } from './ethereum/stargate.pool.token-fetcher'; import { EthereumStargateVotingEscrowContractPositionFetcher } from './ethereum/stargate.voting-escrow.contract-position-fetcher'; import { FantomStargateFarmContractPositionFetcher } from './fantom/stargate.farm.contract-position-fetcher'; import { FantomStargatePoolTokenFetcher } from './fantom/stargate.pool.token-fetcher'; import { FantomStargateVotingEscrowContractPositionFetcher } from './fantom/stargate.voting-escrow.contract-position-fetcher'; -import { OptimismStargateEthTokenFetcher } from './optimism/stargate.eth.token-fetcher'; import { OptimismStargateFarmContractPositionFetcher } from './optimism/stargate.farm.contract-position-fetcher'; import { OptimismStargateLpStakingContractPositionFetcher } from './optimism/stargate.lp-staking.contract-position-fetcher'; import { OptimismStargatePoolTokenFetcher } from './optimism/stargate.pool.token-fetcher'; @@ -37,7 +33,6 @@ import { PolygonStargateVotingEscrowContractPositionFetcher } from './polygon/st providers: [ StargateViemContractFactory, // Arbitrum - ArbitrumStargateEthTokenFetcher, ArbitrumStargateFarmContractPositionFetcher, ArbitrumStargatePoolTokenFetcher, ArbitrumStargateVotingEscrowContractPositionFetcher, @@ -47,7 +42,6 @@ import { PolygonStargateVotingEscrowContractPositionFetcher } from './polygon/st AvalancheStargatePoolTokenFetcher, AvalancheStargateVotingEscrowContractPositionFetcher, // Base - BaseStargateEthTokenFetcher, BaseStargateFarmContractPositionFetcher, BaseStargatePoolTokenFetcher, // Binance-smart-chain @@ -55,7 +49,6 @@ import { PolygonStargateVotingEscrowContractPositionFetcher } from './polygon/st BinanceSmartChainStargatePoolTokenFetcher, BinanceSmartChainStargateVotingEscrowContractPositionFetcher, // Ethereum - EthereumStargateEthTokenFetcher, EthereumStargateFarmContractPositionFetcher, EthereumStargatePoolTokenFetcher, EthereumStargateVotingEscrowContractPositionFetcher, @@ -64,7 +57,6 @@ import { PolygonStargateVotingEscrowContractPositionFetcher } from './polygon/st FantomStargatePoolTokenFetcher, FantomStargateVotingEscrowContractPositionFetcher, // Optimism - OptimismStargateEthTokenFetcher, OptimismStargateFarmContractPositionFetcher, OptimismStargatePoolTokenFetcher, OptimismStargateVotingEscrowContractPositionFetcher, diff --git a/src/apps/tarot/fantom/tarot.vault.token-fetcher.ts b/src/apps/tarot/fantom/tarot.vault.token-fetcher.ts deleted file mode 100644 index 188fd449a..000000000 --- a/src/apps/tarot/fantom/tarot.vault.token-fetcher.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetDataPropsParams, - GetPricePerShareParams, - GetUnderlyingTokensParams, -} from '~position/template/app-token.template.types'; - -import { TarotViemContractFactory } from '../contracts'; -import { TarotSupplyVault } from '../contracts/viem'; - -@PositionTemplate() -export class FantomTarotVaultTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Vaults'; - - constructor( - @Inject(APP_TOOLKIT) readonly appToolkit: IAppToolkit, - @Inject(TarotViemContractFactory) private readonly contractFactory: TarotViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.tarotSupplyVault({ address, network: this.network }); - } - - async getAddresses() { - return [ - '0x74d1d2a851e339b8cb953716445be7e8abdf92f4', // xTAROT - '0x0defef0c977809db8c1a3f13fd8dacbd565d968e', // tFTM - '0x68d211bc1e66814575d89bbe4f352b4cdbdacdfb', // tUSDC - '0x87d05774362ff39af4944f949a34399baeb64a35', // tUSDC (Paused) - ]; - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.underlying(), network: this.network }]; - } - - async getPricePerShare({ contract, appToken }: GetPricePerShareParams) { - const [underlyingToken] = appToken.tokens; - const reserveRaw = await contract.read.getTotalUnderlying(); - - const reserve = Number(reserveRaw) / 10 ** underlyingToken.decimals; - const pricePerShare = appToken.supply > 0 ? reserve / appToken.supply : 0; - return [pricePerShare]; - } - - async getLiquidity({ contract, appToken }: GetDataPropsParams) { - const reserveRaw = await contract.read.getTotalUnderlying(); - const reserve = Number(reserveRaw) / 10 ** appToken.tokens[0].decimals; - const liquidity = appToken.tokens[0].price * reserve; - return liquidity; - } - - async getReserves({ contract, appToken }: GetDataPropsParams) { - const reserveRaw = await contract.read.getTotalUnderlying(); - const reserve = Number(reserveRaw) / 10 ** appToken.tokens[0].decimals; - return [reserve]; - } -} diff --git a/src/apps/tarot/tarot.module.ts b/src/apps/tarot/tarot.module.ts index 0d0811100..bf1f21bf4 100644 --- a/src/apps/tarot/tarot.module.ts +++ b/src/apps/tarot/tarot.module.ts @@ -5,14 +5,8 @@ import { AbstractApp } from '~app/app.dynamic-module'; import { TarotViemContractFactory } from './contracts'; import { FantomTarotBorrowContractPositionFetcher } from './fantom/tarot.borrow.contract-position-fetcher'; import { FantomTarotSupplyTokenFetcher } from './fantom/tarot.supply.token-fetcher'; -import { FantomTarotVaultTokenFetcher } from './fantom/tarot.vault.token-fetcher'; @Module({ - providers: [ - TarotViemContractFactory, - FantomTarotBorrowContractPositionFetcher, - FantomTarotSupplyTokenFetcher, - FantomTarotVaultTokenFetcher, - ], + providers: [TarotViemContractFactory, FantomTarotBorrowContractPositionFetcher, FantomTarotSupplyTokenFetcher], }) export class TarotAppModule extends AbstractApp() {} diff --git a/src/apps/umami-finance/arbitrum/umami-finance.compound.token-fetcher.ts b/src/apps/umami-finance/arbitrum/umami-finance.compound.token-fetcher.ts deleted file mode 100644 index ea713d730..000000000 --- a/src/apps/umami-finance/arbitrum/umami-finance.compound.token-fetcher.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { getTokenImg } from '~app-toolkit/helpers/presentation/image.present'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetDataPropsParams, - GetPricePerShareParams, - GetDisplayPropsParams, -} from '~position/template/app-token.template.types'; - -import { UmamiFinanceViemContractFactory } from '../contracts'; -import { UmamiFinanceCompound } from '../contracts/viem'; - -@PositionTemplate() -export class ArbitrumUmamiFinanceCompoundTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Compounding Marinating UMAMI'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(UmamiFinanceViemContractFactory) protected readonly contractFactory: UmamiFinanceViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.umamiFinanceCompound({ network: this.network, address }); - } - - async getAddresses(): Promise { - return ['0x1922c36f3bc762ca300b4a46bb2102f84b1684ab']; - } - - async getUnderlyingTokenDefinitions() { - return [{ address: '0x2adabd6e8ce3e82f52d9998a7f64a90d294a92a4', network: this.network }]; - } - - async getPricePerShare({ appToken }: GetPricePerShareParams) { - const underlyingTokenContract = this.contractFactory.umamiFinanceMarinate({ - address: appToken.tokens[0].address, - network: this.network, - }); - - const balanceRaw = await underlyingTokenContract.read.balanceOf([appToken.address]); - const reserve = Number(balanceRaw) / 10 ** appToken.decimals; - const pricePerShare = reserve / appToken.supply; - return [pricePerShare]; - } - - async getReserves({ appToken }: GetDataPropsParams) { - const underlyingTokenContract = this.contractFactory.umamiFinanceMarinate({ - address: appToken.tokens[0].address, - network: this.network, - }); - - const balanceRaw = await underlyingTokenContract.read.balanceOf([appToken.address]); - const reserve = Number(balanceRaw) / 10 ** appToken.decimals; - return [reserve]; - } - - async getImages({ appToken }: GetDisplayPropsParams): Promise { - return [getTokenImg(appToken.address, this.network)]; - } -} diff --git a/src/apps/umami-finance/arbitrum/umami-finance.glp-vaults.token-fetcher.ts b/src/apps/umami-finance/arbitrum/umami-finance.glp-vaults.token-fetcher.ts deleted file mode 100644 index f5e626612..000000000 --- a/src/apps/umami-finance/arbitrum/umami-finance.glp-vaults.token-fetcher.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { getTokenImg } from '~app-toolkit/helpers/presentation/image.present'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetAddressesParams, - GetUnderlyingTokensParams, - UnderlyingTokenDefinition, - GetPricePerShareParams, - DefaultAppTokenDataProps, - GetDisplayPropsParams, -} from '~position/template/app-token.template.types'; - -import { UmamiFinanceGlpVaultAddress } from '../common/umami-finance.constants'; -import { UmamiFinanceViemContractFactory } from '../contracts'; -import { UmamiFinanceGlpVault } from '../contracts/viem/UmamiFinanceGlpVault'; - -export type UmamiFinanceGlpVaultAppTokenDefinition = { - address: string; - timelockedVaultAddress: string; - apiId: string; -}; - -@PositionTemplate() -export class ArbitrumUmamiFinanceGlpVaultsTokenFetcher extends AppTokenTemplatePositionFetcher< - UmamiFinanceGlpVault, - DefaultAppTokenDataProps, - UmamiFinanceGlpVaultAppTokenDefinition -> { - groupLabel = 'GLP Vaults'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(UmamiFinanceViemContractFactory) - private readonly umamiFinanceContractFactory: UmamiFinanceViemContractFactory, - ) { - super(appToolkit); - } - - getContract(_address: string) { - return this.umamiFinanceContractFactory.umamiFinanceGlpVault({ address: _address, network: this.network }); - } - - async getAddresses(_params: GetAddressesParams): Promise { - return [ - UmamiFinanceGlpVaultAddress.GLP_USDC, - UmamiFinanceGlpVaultAddress.GLP_WETH, - UmamiFinanceGlpVaultAddress.GLP_WBTC, - UmamiFinanceGlpVaultAddress.GLP_LINK, - UmamiFinanceGlpVaultAddress.GLP_UNI, - ]; - } - - async getUnderlyingTokenDefinitions({ - contract, - }: GetUnderlyingTokensParams): Promise< - UnderlyingTokenDefinition[] - > { - const underlyingToken = await contract.read.asset(); - return [{ address: underlyingToken, network: this.network }]; - } - - async getPricePerShare({ - contract, - appToken, - }: GetPricePerShareParams< - UmamiFinanceGlpVault, - DefaultAppTokenDataProps, - UmamiFinanceGlpVaultAppTokenDefinition - >): Promise { - const pricePerShareRaw = await contract.read.pps(); - const pricePerShare = Number(pricePerShareRaw) / 10 ** appToken.decimals; - - return [pricePerShare]; - } - - async getLabel({ appToken }: GetDisplayPropsParams): Promise { - return `GLP ${appToken.tokens[0].symbol}`; - } - - async getImages({ - appToken, - }: GetDisplayPropsParams< - UmamiFinanceGlpVault, - DefaultAppTokenDataProps, - UmamiFinanceGlpVaultAppTokenDefinition - >): Promise { - return [getTokenImg(appToken.address, this.network)]; - } -} diff --git a/src/apps/umami-finance/arbitrum/umami-finance.marinate-umami.token-fetcher.ts b/src/apps/umami-finance/arbitrum/umami-finance.marinate-umami.token-fetcher.ts deleted file mode 100644 index 7663d8cc9..000000000 --- a/src/apps/umami-finance/arbitrum/umami-finance.marinate-umami.token-fetcher.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { getTokenImg } from '~app-toolkit/helpers/presentation/image.present'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { GetDisplayPropsParams } from '~position/template/app-token.template.types'; - -import { UmamiFinanceViemContractFactory } from '../contracts'; -import { UmamiFinanceMarinate } from '../contracts/viem'; - -@PositionTemplate() -export class ArbitrumUmamiFinanceMarinateUmamiTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'mUMAMI'; - isExcludedFromBalances = true; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(UmamiFinanceViemContractFactory) protected readonly contractFactory: UmamiFinanceViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.umamiFinanceMarinate({ network: this.network, address }); - } - - async getAddresses(): Promise { - return ['0x2adabd6e8ce3e82f52d9998a7f64a90d294a92a4']; - } - - async getUnderlyingTokenDefinitions() { - return [{ address: '0x1622bf67e6e5747b81866fe0b85178a93c7f86e3', network: this.network }]; - } - - async getPricePerShare() { - return [1]; - } - - async getImages({ appToken }: GetDisplayPropsParams): Promise { - return [getTokenImg(appToken.address, this.network)]; - } -} diff --git a/src/apps/umami-finance/arbitrum/umami-finance.timelocked-glp-vaults.token-fetcher.ts b/src/apps/umami-finance/arbitrum/umami-finance.timelocked-glp-vaults.token-fetcher.ts deleted file mode 100644 index 32756b85d..000000000 --- a/src/apps/umami-finance/arbitrum/umami-finance.timelocked-glp-vaults.token-fetcher.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { getTokenImg } from '~app-toolkit/helpers/presentation/image.present'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetAddressesParams, - DefaultAppTokenDefinition, - GetUnderlyingTokensParams, - UnderlyingTokenDefinition, - GetPricePerShareParams, - GetDisplayPropsParams, -} from '~position/template/app-token.template.types'; - -import { UmamiFinanceTimelockedGlpVaultAddress } from '../common/umami-finance.constants'; -import { UmamiFinanceViemContractFactory } from '../contracts'; -import { UmamiFinanceTimelockedGlpVault } from '../contracts/viem/UmamiFinanceTimelockedGlpVault'; - -@PositionTemplate() -export class ArbitrumUmamiFinanceTimelockedGlpVaultsTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Timelocked GLP Vaults'; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(UmamiFinanceViemContractFactory) - private readonly umamiFinanceContractFactory: UmamiFinanceViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.umamiFinanceContractFactory.umamiFinanceTimelockedGlpVault({ - address, - network: this.network, - }); - } - - async getAddresses(_params: GetAddressesParams): Promise { - return [ - UmamiFinanceTimelockedGlpVaultAddress.TL_GLP_USDC, - UmamiFinanceTimelockedGlpVaultAddress.TL_GLP_WETH, - UmamiFinanceTimelockedGlpVaultAddress.TL_GLP_WBTC, - UmamiFinanceTimelockedGlpVaultAddress.TL_GLP_LINK, - UmamiFinanceTimelockedGlpVaultAddress.TL_GLP_UNI, - ]; - } - - async getUnderlyingTokenDefinitions({ - contract, - }: GetUnderlyingTokensParams): Promise { - return [{ address: await contract.read.asset(), network: this.network }]; - } - - async getPricePerShare({ - contract, - appToken, - }: GetPricePerShareParams): Promise { - const pricePerShareRaw = await contract.read.pps(); - const pricePerShare = Number(pricePerShareRaw) / 10 ** appToken.decimals; - - return [pricePerShare]; - } - - async getLabel({ appToken }: GetDisplayPropsParams): Promise { - return `Timelocked GLP ${appToken.tokens[0].symbol}`; - } - - async getImages({ appToken }: GetDisplayPropsParams): Promise { - return [getTokenImg(appToken.address, this.network)]; - } -} diff --git a/src/apps/umami-finance/common/umami-finance.constants.ts b/src/apps/umami-finance/common/umami-finance.constants.ts deleted file mode 100644 index 7a20b4726..000000000 --- a/src/apps/umami-finance/common/umami-finance.constants.ts +++ /dev/null @@ -1,15 +0,0 @@ -export enum UmamiFinanceGlpVaultAddress { - GLP_USDC = '0x727ed4ef04bb2a96ec77e44c1a91dbb01b605e42', - GLP_WETH = '0xbb84d79159d6bbe1de148dc82640caa677e06126', - GLP_WBTC = '0x6a89faf99587a12e6bb0351f2fa9006c6cd12257', - GLP_LINK = '0xe0a21a475f8da0ee7fa5af8c1809d8ac5257607d', - GLP_UNI = '0x37c0705a65948ea5e0ae1add13552bcad7711a23', -} - -export enum UmamiFinanceTimelockedGlpVaultAddress { - TL_GLP_USDC = '0xdca4e88c00a8800ebcebad63abdbaaaa755557f9', - TL_GLP_WETH = '0xf2ad33e12a9780f1e42d878a29a3e0756008c838', - TL_GLP_WBTC = '0x83c19ec75d649aec7c99e2c6663ca055569da7c0', - TL_GLP_LINK = '0xb0d9e1832bd973abd8f3b4d710ead21fcbefcb7c', - TL_GLP_UNI = '0xee57e7e3776e4868976f315e07a883955c9225d5', -} diff --git a/src/apps/umami-finance/common/umami-finance.helpers.ts b/src/apps/umami-finance/common/umami-finance.helpers.ts deleted file mode 100644 index f53001c25..000000000 --- a/src/apps/umami-finance/common/umami-finance.helpers.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { UmamiFinanceGlpVaultAddress, UmamiFinanceTimelockedGlpVaultAddress } from './umami-finance.constants'; - -export const getUmamiApiIdFromVaultAddress = (vaultAddress: string): string | null => { - switch (vaultAddress) { - case UmamiFinanceGlpVaultAddress.GLP_USDC: - case UmamiFinanceTimelockedGlpVaultAddress.TL_GLP_USDC: - return 'glpusdc'; - case UmamiFinanceGlpVaultAddress.GLP_WETH: - case UmamiFinanceTimelockedGlpVaultAddress.TL_GLP_WETH: - return 'glpweth'; - case UmamiFinanceGlpVaultAddress.GLP_WBTC: - case UmamiFinanceTimelockedGlpVaultAddress.TL_GLP_WBTC: - return 'glpwbtc'; - case UmamiFinanceGlpVaultAddress.GLP_LINK: - case UmamiFinanceTimelockedGlpVaultAddress.TL_GLP_LINK: - return 'glplink'; - case UmamiFinanceGlpVaultAddress.GLP_UNI: - case UmamiFinanceTimelockedGlpVaultAddress.TL_GLP_UNI: - return 'glpuni'; - default: - return null; - } -}; diff --git a/src/apps/umami-finance/contracts/abis/umami-finance-compound.json b/src/apps/umami-finance/contracts/abis/umami-finance-compound.json deleted file mode 100644 index 7b4674928..000000000 --- a/src/apps/umami-finance/contracts/abis/umami-finance-compound.json +++ /dev/null @@ -1,517 +0,0 @@ -[ - { - "inputs": [ - { "internalType": "string", "name": "_name", "type": "string" }, - { "internalType": "string", "name": "_symbol", "type": "string" }, - { "internalType": "address", "name": "_depositToken", "type": "address" }, - { "internalType": "address", "name": "_marinateContract", "type": "address" }, - { "internalType": "address", "name": "_router", "type": "address" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "Claim", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "Deposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "address", "name": "token", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "uint256", "name": "newTotalDeposits", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "newTotalSupply", "type": "uint256" } - ], - "name": "Reinvest", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, - { "indexed": true, "internalType": "bytes32", "name": "previousAdminRole", "type": "bytes32" }, - { "indexed": true, "internalType": "bytes32", "name": "newAdminRole", "type": "bytes32" } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, - { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, - { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, - { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "uint256", "name": "oldValue", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "newValue", "type": "uint256" } - ], - "name": "UpdateAdminFee", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "uint256", "name": "oldValue", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "newValue", "type": "uint256" } - ], - "name": "UpdateMinTokensToReinvest", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "uint256", "name": "oldValue", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "newValue", "type": "uint256" } - ], - "name": "UpdateMinTokensToReinvestBeforeDeposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "uint256", "name": "oldValue", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "newValue", "type": "uint256" } - ], - "name": "UpdateReinvestReward", - "type": "event" - }, - { - "anonymous": false, - "inputs": [{ "indexed": false, "internalType": "bool", "name": "newValue", "type": "bool" }], - "name": "UpdateRequireReinvestBeforeDeposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": false, "internalType": "uint256", "name": "oldValue", "type": "uint256" }, - { "indexed": false, "internalType": "uint256", "name": "newValue", "type": "uint256" } - ], - "name": "UpdateWithdrawFee", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, - { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "Withdraw", - "type": "event" - }, - { - "inputs": [], - "name": "ADMIN_FEE_BIPS", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ADMIN_ROLE", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MIN_TOKENS_TO_REINVEST", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "REINVEST_REWARD_BIPS", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "rewardToken", "type": "address" }, - { "internalType": "bytes", "name": "swapRoute", "type": "bytes" } - ], - "name": "addRewardToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "checkReward", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "subtractedValue", "type": "uint256" } - ], - "name": "decreaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "deposit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "depositToken", - "outputs": [{ "internalType": "contract IERC20", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "feeDestination", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "getDepositTokensForShares", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "bytes32", "name": "role", "type": "bytes32" }], - "name": "getRoleAdmin", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "getSharesForDepositTokens", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "role", "type": "bytes32" }, - { "internalType": "address", "name": "account", "type": "address" } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "role", "type": "bytes32" }, - { "internalType": "address", "name": "account", "type": "address" } - ], - "name": "hasRole", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "addedValue", "type": "uint256" } - ], - "name": "increaseAllowance", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "isRewardToken", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "marinateContract", - "outputs": [{ "internalType": "contract IMarinateV2", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "token", "type": "address" }, - { "internalType": "address", "name": "destination", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "migrateToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "recoverETH", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { "inputs": [], "name": "reinvest", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [{ "internalType": "address", "name": "rewardToken", "type": "address" }], - "name": "removeRewardToken", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "role", "type": "bytes32" }, - { "internalType": "address", "name": "account", "type": "address" } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "token", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" } - ], - "name": "revokeAllowance", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "role", "type": "bytes32" }, - { "internalType": "address", "name": "account", "type": "address" } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "name": "rewardTokens", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "rewardTokensLength", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "router", - "outputs": [{ "internalType": "contract ISwapRouter", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "name": "routes", - "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }], - "stateMutability": "view", - "type": "function" - }, - { "inputs": [], "name": "setAllowances", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [{ "internalType": "address", "name": "newDestination", "type": "address" }], - "name": "setFeeDestination", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" }], - "name": "supportsInterface", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalDeposits", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "newValue", "type": "uint256" }], - "name": "updateAdminFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "newValue", "type": "uint256" }], - "name": "updateMinTokensToReinvest", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "newValue", "type": "uint256" }], - "name": "updateReinvestReward", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], - "name": "withdraw", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/umami-finance/contracts/abis/umami-finance-glp-vault.json b/src/apps/umami-finance/contracts/abis/umami-finance-glp-vault.json deleted file mode 100644 index afcac1731..000000000 --- a/src/apps/umami-finance/contracts/abis/umami-finance-glp-vault.json +++ /dev/null @@ -1,931 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "contract ERC20", - "name": "_asset", - "type": "address" - }, - { - "internalType": "string", - "name": "_name", - "type": "string" - }, - { - "internalType": "string", - "name": "_symbol", - "type": "string" - }, - { - "internalType": "address", - "name": "_aggregateVault", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "caller", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "Deposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Unpaused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "caller", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "Withdraw", - "type": "event" - }, - { - "inputs": [], - "name": "AUTH", - "outputs": [ - { - "internalType": "contract Auth", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DOMAIN_SEPARATOR", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "aggregateVault", - "outputs": [ - { - "internalType": "contract AggregateVault", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "asset", - "outputs": [ - { - "internalType": "contract ERC20", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "convertToAssets", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "name": "convertToShares", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "deposit", - "outputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "maxDeposit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "maxMint", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "maxRedeem", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "maxWithdraw", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "mint", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_mintAmount", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_timelockContract", - "type": "address" - } - ], - "name": "mintTimelockBoost", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "nonces", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pauseDepositWithdraw", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "pps", - "outputs": [ - { - "internalType": "uint256", - "name": "pricePerShare", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "name": "previewDeposit", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "size", - "type": "uint256" - } - ], - "name": "previewDepositFee", - "outputs": [ - { - "internalType": "uint256", - "name": "totalDepositFee", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "previewMint", - "outputs": [ - { - "internalType": "uint256", - "name": "_mintAmount", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "previewRedeem", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "previewVaultCap", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "name": "previewWithdraw", - "outputs": [ - { - "internalType": "uint256", - "name": "_withdrawAmount", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "size", - "type": "uint256" - } - ], - "name": "previewWithdrawalFee", - "outputs": [ - { - "internalType": "uint256", - "name": "totalWithdrawalFee", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "redeem", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalAssets", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "tvl", - "outputs": [ - { - "internalType": "uint256", - "name": "totalValueLocked", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpauseDepositWithdraw", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract AggregateVault", - "name": "_newAggregateVault", - "type": "address" - } - ], - "name": "updateAggregateVault", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "bytes32[]", - "name": "merkleProof", - "type": "bytes32[]" - } - ], - "name": "whitelistDeposit", - "outputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "withdraw", - "outputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/umami-finance/contracts/abis/umami-finance-timelocked-glp-vault.json b/src/apps/umami-finance/contracts/abis/umami-finance-timelocked-glp-vault.json deleted file mode 100644 index 9389985bf..000000000 --- a/src/apps/umami-finance/contracts/abis/umami-finance-timelocked-glp-vault.json +++ /dev/null @@ -1,644 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { "internalType": "contract ERC20", "name": "_asset", "type": "address" }, - { "internalType": "string", "name": "_name", "type": "string" }, - { "internalType": "string", "name": "_symbol", "type": "string" }, - { - "internalType": "uint256", - "name": "_withdrawDuration", - "type": "uint256" - }, - { "internalType": "contract Auth", "name": "_auth", "type": "address" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_asset", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_account", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "Deposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "Unpaused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "caller", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "receiver", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "assets", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "Withdraw", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_asset", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_account", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "WithdrawComplete", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_asset", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "_account", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "_duration", - "type": "uint256" - } - ], - "name": "WithdrawInitiated", - "type": "event" - }, - { - "inputs": [], - "name": "AUTH", - "outputs": [{ "internalType": "contract Auth", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DOMAIN_SEPARATOR", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ZAP", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "activeWithdrawals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "address", "name": "", "type": "address" } - ], - "name": "allowance", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "approve", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "asset", - "outputs": [{ "internalType": "contract ERC20", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "balanceOf", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_receiver", "type": "address" }], - "name": "claimWithdrawals", - "outputs": [{ "internalType": "uint256", "name": "_totalWithdraw", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "_account", "type": "address" }, - { "internalType": "address", "name": "_receiver", "type": "address" } - ], - "name": "claimWithdrawalsFor", - "outputs": [{ "internalType": "uint256", "name": "_totalWithdraw", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_shares", "type": "uint256" }], - "name": "convertToAssets", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_assets", "type": "uint256" }], - "name": "convertToShares", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "assets", "type": "uint256" }, - { "internalType": "address", "name": "receiver", "type": "address" } - ], - "name": "deposit", - "outputs": [{ "internalType": "uint256", "name": "shares", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getLockState", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "withdrawDuration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "activeWithdrawBalance", - "type": "uint256" - } - ], - "internalType": "struct TimelockBoost.TokenLockState", - "name": "state", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_assets", "type": "uint256" }], - "name": "initiateWithdraw", - "outputs": [{ "internalType": "uint256", "name": "shares", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_zap", "type": "address" }], - "name": "initiateZap", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "lockState", - "outputs": [ - { - "internalType": "uint256", - "name": "withdrawDuration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "activeWithdrawBalance", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "maxDeposit", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "maxMint", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], - "name": "maxRedeem", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], - "name": "maxWithdraw", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "shares", "type": "uint256" }, - { "internalType": "address", "name": "receiver", "type": "address" } - ], - "name": "mint", - "outputs": [{ "internalType": "uint256", "name": "assets", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "nonces", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "pauseDepositWithdraw", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "owner", "type": "address" }, - { "internalType": "address", "name": "spender", "type": "address" }, - { "internalType": "uint256", "name": "value", "type": "uint256" }, - { "internalType": "uint256", "name": "deadline", "type": "uint256" }, - { "internalType": "uint8", "name": "v", "type": "uint8" }, - { "internalType": "bytes32", "name": "r", "type": "bytes32" }, - { "internalType": "bytes32", "name": "s", "type": "bytes32" } - ], - "name": "permit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "pps", - "outputs": [{ "internalType": "uint256", "name": "pricePerShare", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_assets", "type": "uint256" }], - "name": "previewDeposit", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_shares", "type": "uint256" }], - "name": "previewMint", - "outputs": [{ "internalType": "uint256", "name": "_mintAmount", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "shares", "type": "uint256" }], - "name": "previewRedeem", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [{ "internalType": "uint256", "name": "_assets", "type": "uint256" }], - "name": "previewWithdraw", - "outputs": [ - { - "internalType": "uint256", - "name": "_withdrawAmount", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "shares", "type": "uint256" }, - { "internalType": "address", "name": "receiver", "type": "address" }, - { "internalType": "address", "name": "owner", "type": "address" } - ], - "name": "redeem", - "outputs": [{ "internalType": "uint256", "name": "assets", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_withdrawalDuration", - "type": "uint256" - } - ], - "name": "setWithdrawalDuration", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [{ "internalType": "string", "name": "", "type": "string" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalAssets", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transfer", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "from", "type": "address" }, - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "name": "transferFrom", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_account", "type": "address" }], - "name": "underlyingBalance", - "outputs": [ - { - "internalType": "uint256", - "name": "_underlyingBalance", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "unpauseDepositWithdraw", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "uint256", "name": "assets", "type": "uint256" }, - { "internalType": "address", "name": "receiver", "type": "address" }, - { "internalType": "address", "name": "owner", "type": "address" } - ], - "name": "withdraw", - "outputs": [{ "internalType": "uint256", "name": "shares", "type": "uint256" }], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "_account", "type": "address" }], - "name": "withdrawRequests", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "queuedTimestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "underlyingAmount", - "type": "uint256" - } - ], - "internalType": "struct TimelockBoost.QueuedWithdrawal[5]", - "name": "", - "type": "tuple[5]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "", "type": "address" }, - { "internalType": "uint256", "name": "", "type": "uint256" } - ], - "name": "withdrawalQueue", - "outputs": [ - { - "internalType": "uint256", - "name": "queuedTimestamp", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "underlyingAmount", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - } -] diff --git a/src/apps/umami-finance/contracts/viem.contract-factory.ts b/src/apps/umami-finance/contracts/viem.contract-factory.ts index e3d41a500..c1153f0e3 100644 --- a/src/apps/umami-finance/contracts/viem.contract-factory.ts +++ b/src/apps/umami-finance/contracts/viem.contract-factory.ts @@ -3,12 +3,7 @@ import { Injectable, Inject } from '@nestjs/common'; import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; import { Network } from '~types/network.interface'; -import { - UmamiFinanceCompound__factory, - UmamiFinanceGlpVault__factory, - UmamiFinanceMarinate__factory, - UmamiFinanceTimelockedGlpVault__factory, -} from './viem'; +import { UmamiFinanceMarinate__factory } from './viem'; type ContractOpts = { address: string; network: Network }; @@ -16,16 +11,7 @@ type ContractOpts = { address: string; network: Network }; export class UmamiFinanceViemContractFactory { constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) {} - umamiFinanceCompound({ address, network }: ContractOpts) { - return UmamiFinanceCompound__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - umamiFinanceGlpVault({ address, network }: ContractOpts) { - return UmamiFinanceGlpVault__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } umamiFinanceMarinate({ address, network }: ContractOpts) { return UmamiFinanceMarinate__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); } - umamiFinanceTimelockedGlpVault({ address, network }: ContractOpts) { - return UmamiFinanceTimelockedGlpVault__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } } diff --git a/src/apps/umami-finance/contracts/viem/UmamiFinanceCompound.ts b/src/apps/umami-finance/contracts/viem/UmamiFinanceCompound.ts deleted file mode 100644 index beebccf81..000000000 --- a/src/apps/umami-finance/contracts/viem/UmamiFinanceCompound.ts +++ /dev/null @@ -1,1139 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const umamiFinanceCompoundAbi = [ - { - inputs: [ - { - internalType: 'string', - name: '_name', - type: 'string', - }, - { - internalType: 'string', - name: '_symbol', - type: 'string', - }, - { - internalType: 'address', - name: '_depositToken', - type: 'address', - }, - { - internalType: 'address', - name: '_marinateContract', - type: 'address', - }, - { - internalType: 'address', - name: '_router', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'account', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Claim', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'account', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Deposit', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'token', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Recovered', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'newTotalDeposits', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'newTotalSupply', - type: 'uint256', - }, - ], - name: 'Reinvest', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'role', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'bytes32', - name: 'previousAdminRole', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'bytes32', - name: 'newAdminRole', - type: 'bytes32', - }, - ], - name: 'RoleAdminChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'role', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'address', - name: 'account', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'sender', - type: 'address', - }, - ], - name: 'RoleGranted', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'bytes32', - name: 'role', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'address', - name: 'account', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'sender', - type: 'address', - }, - ], - name: 'RoleRevoked', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'oldValue', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'newValue', - type: 'uint256', - }, - ], - name: 'UpdateAdminFee', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'oldValue', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'newValue', - type: 'uint256', - }, - ], - name: 'UpdateMinTokensToReinvest', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'oldValue', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'newValue', - type: 'uint256', - }, - ], - name: 'UpdateMinTokensToReinvestBeforeDeposit', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'oldValue', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'newValue', - type: 'uint256', - }, - ], - name: 'UpdateReinvestReward', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'bool', - name: 'newValue', - type: 'bool', - }, - ], - name: 'UpdateRequireReinvestBeforeDeposit', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'oldValue', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'newValue', - type: 'uint256', - }, - ], - name: 'UpdateWithdrawFee', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'account', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Withdraw', - type: 'event', - }, - { - inputs: [], - name: 'ADMIN_FEE_BIPS', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'ADMIN_ROLE', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'DEFAULT_ADMIN_ROLE', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'MIN_TOKENS_TO_REINVEST', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'REINVEST_REWARD_BIPS', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'rewardToken', - type: 'address', - }, - { - internalType: 'bytes', - name: 'swapRoute', - type: 'bytes', - }, - ], - name: 'addRewardToken', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'checkReward', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'subtractedValue', - type: 'uint256', - }, - ], - name: 'decreaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'deposit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'depositToken', - outputs: [ - { - internalType: 'contract IERC20', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'feeDestination', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'getDepositTokensForShares', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'role', - type: 'bytes32', - }, - ], - name: 'getRoleAdmin', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'getSharesForDepositTokens', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'role', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'grantRole', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'role', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'hasRole', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'addedValue', - type: 'uint256', - }, - ], - name: 'increaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'isRewardToken', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'marinateContract', - outputs: [ - { - internalType: 'contract IMarinateV2', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - { - internalType: 'address', - name: 'destination', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'migrateToken', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'recoverETH', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'reinvest', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'rewardToken', - type: 'address', - }, - ], - name: 'removeRewardToken', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'role', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'renounceRole', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'token', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'revokeAllowance', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'role', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'revokeRole', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'rewardTokens', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'rewardTokensLength', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'router', - outputs: [ - { - internalType: 'contract ISwapRouter', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'routes', - outputs: [ - { - internalType: 'bytes', - name: '', - type: 'bytes', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'setAllowances', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newDestination', - type: 'address', - }, - ], - name: 'setFeeDestination', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes4', - name: 'interfaceId', - type: 'bytes4', - }, - ], - name: 'supportsInterface', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalDeposits', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'newValue', - type: 'uint256', - }, - ], - name: 'updateAdminFee', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'newValue', - type: 'uint256', - }, - ], - name: 'updateMinTokensToReinvest', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'newValue', - type: 'uint256', - }, - ], - name: 'updateReinvestReward', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'withdraw', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type UmamiFinanceCompound = typeof umamiFinanceCompoundAbi; -export type UmamiFinanceCompoundContract = GetContractReturnType; - -export class UmamiFinanceCompound__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: umamiFinanceCompoundAbi, publicClient: client }); - } -} diff --git a/src/apps/umami-finance/contracts/viem/UmamiFinanceGlpVault.ts b/src/apps/umami-finance/contracts/viem/UmamiFinanceGlpVault.ts deleted file mode 100644 index 75ee3e5b7..000000000 --- a/src/apps/umami-finance/contracts/viem/UmamiFinanceGlpVault.ts +++ /dev/null @@ -1,945 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const umamiFinanceGlpVaultAbi = [ - { - inputs: [ - { - internalType: 'contract ERC20', - name: '_asset', - type: 'address', - }, - { - internalType: 'string', - name: '_name', - type: 'string', - }, - { - internalType: 'string', - name: '_symbol', - type: 'string', - }, - { - internalType: 'address', - name: '_aggregateVault', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'Deposit', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'Paused', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'Unpaused', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'Withdraw', - type: 'event', - }, - { - inputs: [], - name: 'AUTH', - outputs: [ - { - internalType: 'contract Auth', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'DOMAIN_SEPARATOR', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'aggregateVault', - outputs: [ - { - internalType: 'contract AggregateVault', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'asset', - outputs: [ - { - internalType: 'contract ERC20', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'convertToAssets', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - ], - name: 'convertToShares', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - ], - name: 'deposit', - outputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'maxDeposit', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'maxMint', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'maxRedeem', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'maxWithdraw', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - ], - name: 'mint', - outputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_mintAmount', - type: 'uint256', - }, - { - internalType: 'address', - name: '_timelockContract', - type: 'address', - }, - ], - name: 'mintTimelockBoost', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'nonces', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'pauseDepositWithdraw', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'paused', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - ], - name: 'permit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'pps', - outputs: [ - { - internalType: 'uint256', - name: 'pricePerShare', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - ], - name: 'previewDeposit', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'size', - type: 'uint256', - }, - ], - name: 'previewDepositFee', - outputs: [ - { - internalType: 'uint256', - name: 'totalDepositFee', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'previewMint', - outputs: [ - { - internalType: 'uint256', - name: '_mintAmount', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'previewRedeem', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'previewVaultCap', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - ], - name: 'previewWithdraw', - outputs: [ - { - internalType: 'uint256', - name: '_withdrawAmount', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'size', - type: 'uint256', - }, - ], - name: 'previewWithdrawalFee', - outputs: [ - { - internalType: 'uint256', - name: 'totalWithdrawalFee', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'redeem', - outputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalAssets', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'tvl', - outputs: [ - { - internalType: 'uint256', - name: 'totalValueLocked', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'unpauseDepositWithdraw', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'contract AggregateVault', - name: '_newAggregateVault', - type: 'address', - }, - ], - name: 'updateAggregateVault', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - internalType: 'bytes32[]', - name: 'merkleProof', - type: 'bytes32[]', - }, - ], - name: 'whitelistDeposit', - outputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'withdraw', - outputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type UmamiFinanceGlpVault = typeof umamiFinanceGlpVaultAbi; -export type UmamiFinanceGlpVaultContract = GetContractReturnType; - -export class UmamiFinanceGlpVault__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: umamiFinanceGlpVaultAbi, publicClient: client }); - } -} diff --git a/src/apps/umami-finance/contracts/viem/UmamiFinanceTimelockedGlpVault.ts b/src/apps/umami-finance/contracts/viem/UmamiFinanceTimelockedGlpVault.ts deleted file mode 100644 index 861998ece..000000000 --- a/src/apps/umami-finance/contracts/viem/UmamiFinanceTimelockedGlpVault.ts +++ /dev/null @@ -1,1109 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const umamiFinanceTimelockedGlpVaultAbi = [ - { - anonymous: false, - inputs: [ - { - internalType: 'contract ERC20', - name: '_asset', - type: 'address', - }, - { - internalType: 'string', - name: '_name', - type: 'string', - }, - { - internalType: 'string', - name: '_symbol', - type: 'string', - }, - { - internalType: 'uint256', - name: '_withdrawDuration', - type: 'uint256', - }, - { - internalType: 'contract Auth', - name: '_auth', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: '_asset', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: '_account', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'Deposit', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'Paused', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'account', - type: 'address', - }, - ], - name: 'Unpaused', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'caller', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'Withdraw', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: '_asset', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: '_account', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - ], - name: 'WithdrawComplete', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: '_asset', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: '_account', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: '_amount', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: '_duration', - type: 'uint256', - }, - ], - name: 'WithdrawInitiated', - type: 'event', - }, - { - inputs: [], - name: 'AUTH', - outputs: [ - { - internalType: 'contract Auth', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'DOMAIN_SEPARATOR', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'ZAP', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'activeWithdrawals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'asset', - outputs: [ - { - internalType: 'contract ERC20', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_receiver', - type: 'address', - }, - ], - name: 'claimWithdrawals', - outputs: [ - { - internalType: 'uint256', - name: '_totalWithdraw', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_account', - type: 'address', - }, - { - internalType: 'address', - name: '_receiver', - type: 'address', - }, - ], - name: 'claimWithdrawalsFor', - outputs: [ - { - internalType: 'uint256', - name: '_totalWithdraw', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_shares', - type: 'uint256', - }, - ], - name: 'convertToAssets', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_assets', - type: 'uint256', - }, - ], - name: 'convertToShares', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - ], - name: 'deposit', - outputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'getLockState', - outputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'withdrawDuration', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'activeWithdrawBalance', - type: 'uint256', - }, - ], - internalType: 'struct TimelockBoost.TokenLockState', - name: 'state', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_assets', - type: 'uint256', - }, - ], - name: 'initiateWithdraw', - outputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_zap', - type: 'address', - }, - ], - name: 'initiateZap', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'lockState', - outputs: [ - { - internalType: 'uint256', - name: 'withdrawDuration', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'activeWithdrawBalance', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'maxDeposit', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'maxMint', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'maxRedeem', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'maxWithdraw', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - ], - name: 'mint', - outputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - name: 'nonces', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'pauseDepositWithdraw', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'paused', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'deadline', - type: 'uint256', - }, - { - internalType: 'uint8', - name: 'v', - type: 'uint8', - }, - { - internalType: 'bytes32', - name: 'r', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 's', - type: 'bytes32', - }, - ], - name: 'permit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'pps', - outputs: [ - { - internalType: 'uint256', - name: 'pricePerShare', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_assets', - type: 'uint256', - }, - ], - name: 'previewDeposit', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_shares', - type: 'uint256', - }, - ], - name: 'previewMint', - outputs: [ - { - internalType: 'uint256', - name: '_mintAmount', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - name: 'previewRedeem', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_assets', - type: 'uint256', - }, - ], - name: 'previewWithdraw', - outputs: [ - { - internalType: 'uint256', - name: '_withdrawAmount', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'redeem', - outputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: '_withdrawalDuration', - type: 'uint256', - }, - ], - name: 'setWithdrawalDuration', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalAssets', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_account', - type: 'address', - }, - ], - name: 'underlyingBalance', - outputs: [ - { - internalType: 'uint256', - name: '_underlyingBalance', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'unpauseDepositWithdraw', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'assets', - type: 'uint256', - }, - { - internalType: 'address', - name: 'receiver', - type: 'address', - }, - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - ], - name: 'withdraw', - outputs: [ - { - internalType: 'uint256', - name: 'shares', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '_account', - type: 'address', - }, - ], - name: 'withdrawRequests', - outputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'queuedTimestamp', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'underlyingAmount', - type: 'uint256', - }, - ], - internalType: 'struct TimelockBoost.QueuedWithdrawal[5]', - name: '', - type: 'tuple[5]', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'withdrawalQueue', - outputs: [ - { - internalType: 'uint256', - name: 'queuedTimestamp', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'underlyingAmount', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, -] as const; - -export type UmamiFinanceTimelockedGlpVault = typeof umamiFinanceTimelockedGlpVaultAbi; -export type UmamiFinanceTimelockedGlpVaultContract = GetContractReturnType< - UmamiFinanceTimelockedGlpVault, - PublicClient ->; - -export class UmamiFinanceTimelockedGlpVault__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: umamiFinanceTimelockedGlpVaultAbi, publicClient: client }); - } -} diff --git a/src/apps/umami-finance/contracts/viem/index.ts b/src/apps/umami-finance/contracts/viem/index.ts index d20b19109..be28eaf76 100644 --- a/src/apps/umami-finance/contracts/viem/index.ts +++ b/src/apps/umami-finance/contracts/viem/index.ts @@ -2,12 +2,6 @@ /* tslint:disable */ /* eslint-disable */ -export type { UmamiFinanceCompound } from './UmamiFinanceCompound'; -export type { UmamiFinanceGlpVault } from './UmamiFinanceGlpVault'; export type { UmamiFinanceMarinate } from './UmamiFinanceMarinate'; -export type { UmamiFinanceTimelockedGlpVault } from './UmamiFinanceTimelockedGlpVault'; -export { UmamiFinanceCompound__factory } from './UmamiFinanceCompound'; -export { UmamiFinanceGlpVault__factory } from './UmamiFinanceGlpVault'; export { UmamiFinanceMarinate__factory } from './UmamiFinanceMarinate'; -export { UmamiFinanceTimelockedGlpVault__factory } from './UmamiFinanceTimelockedGlpVault'; diff --git a/src/apps/umami-finance/umami-finance.module.ts b/src/apps/umami-finance/umami-finance.module.ts index 4f854ab82..8cb323849 100644 --- a/src/apps/umami-finance/umami-finance.module.ts +++ b/src/apps/umami-finance/umami-finance.module.ts @@ -2,21 +2,10 @@ import { Module } from '@nestjs/common'; import { AbstractApp } from '~app/app.dynamic-module'; -import { ArbitrumUmamiFinanceCompoundTokenFetcher } from './arbitrum/umami-finance.compound.token-fetcher'; -import { ArbitrumUmamiFinanceGlpVaultsTokenFetcher } from './arbitrum/umami-finance.glp-vaults.token-fetcher'; -import { ArbitrumUmamiFinanceMarinateUmamiTokenFetcher } from './arbitrum/umami-finance.marinate-umami.token-fetcher'; import { ArbitrumUmamiFinanceMarinateContractPositionFetcher } from './arbitrum/umami-finance.marinate.contract-position-fetcher'; -import { ArbitrumUmamiFinanceTimelockedGlpVaultsTokenFetcher } from './arbitrum/umami-finance.timelocked-glp-vaults.token-fetcher'; import { UmamiFinanceViemContractFactory } from './contracts'; @Module({ - providers: [ - ArbitrumUmamiFinanceCompoundTokenFetcher, - ArbitrumUmamiFinanceGlpVaultsTokenFetcher, - ArbitrumUmamiFinanceMarinateContractPositionFetcher, - ArbitrumUmamiFinanceMarinateUmamiTokenFetcher, - ArbitrumUmamiFinanceTimelockedGlpVaultsTokenFetcher, - UmamiFinanceViemContractFactory, - ], + providers: [ArbitrumUmamiFinanceMarinateContractPositionFetcher, UmamiFinanceViemContractFactory], }) export class UmamiFinanceAppModule extends AbstractApp() {} diff --git a/src/apps/unlockd-finance/contracts/abis/unlockd-finance-debt-token.json b/src/apps/unlockd-finance/contracts/abis/unlockd-finance-debt-token.json deleted file mode 100644 index 4e1b3bdf2..000000000 --- a/src/apps/unlockd-finance/contracts/abis/unlockd-finance-debt-token.json +++ /dev/null @@ -1,623 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "fromUser", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "toUser", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "BorrowAllowanceDelegated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "Burn", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "underlyingAsset", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "pool", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "incentivesController", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint8", - "name": "debtTokenDecimals", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "string", - "name": "debtTokenName", - "type": "string" - }, - { - "indexed": false, - "internalType": "string", - "name": "debtTokenSymbol", - "type": "string" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "Mint", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "inputs": [], - "name": "POOL", - "outputs": [ - { - "internalType": "contract ILendPool", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "UNDERLYING_ASSET_ADDRESS", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "delegatee", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approveDelegation", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "user", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "fromUser", - "type": "address" - }, - { - "internalType": "address", - "name": "toUser", - "type": "address" - } - ], - "name": "borrowAllowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getIncentivesController", - "outputs": [ - { - "internalType": "contract IIncentivesController", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "user", - "type": "address" - } - ], - "name": "getScaledUserBalanceAndSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract ILendPoolAddressesProvider", - "name": "addressProvider", - "type": "address" - }, - { - "internalType": "address", - "name": "underlyingAsset", - "type": "address" - }, - { - "internalType": "uint8", - "name": "debtTokenDecimals", - "type": "uint8" - }, - { - "internalType": "string", - "name": "debtTokenName", - "type": "string" - }, - { - "internalType": "string", - "name": "debtTokenSymbol", - "type": "string" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "initiator", - "type": "address" - }, - { - "internalType": "address", - "name": "onBehalfOf", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "mint", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "user", - "type": "address" - } - ], - "name": "scaledBalanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "scaledTotalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/unlockd-finance/contracts/abis/unlockd-finance-lend-pool-addresses-provider.json b/src/apps/unlockd-finance/contracts/abis/unlockd-finance-lend-pool-addresses-provider.json deleted file mode 100644 index 508e0656e..000000000 --- a/src/apps/unlockd-finance/contracts/abis/unlockd-finance-lend-pool-addresses-provider.json +++ /dev/null @@ -1,903 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "string", - "name": "marketId", - "type": "string" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "id", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "bool", - "name": "hasProxy", - "type": "bool" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "encodedCallData", - "type": "bytes" - } - ], - "name": "AddressSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "ConfigurationAdminUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "EmergencyAdminUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "IncentivesControllerUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "LSSVMRouterUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "encodedCallData", - "type": "bytes" - } - ], - "name": "LendPoolConfiguratorUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "LendPoolLiquidatorUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "encodedCallData", - "type": "bytes" - } - ], - "name": "LendPoolLoanUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "encodedCallData", - "type": "bytes" - } - ], - "name": "LendPoolUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "LtvManagerUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "string", - "name": "newMarketId", - "type": "string" - } - ], - "name": "MarketIdSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "NFTXVaultFactoryUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "NftOracleUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "id", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "ProxyCreated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "ReserveOracleUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "SushiSwapRouterUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "UIDataProviderUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "UNFTRegistryUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "UnlockdDataProviderUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "WalletBalanceProviderUpdated", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "id", - "type": "bytes32" - } - ], - "name": "getAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getEmergencyAdmin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "proxyAddress", - "type": "address" - } - ], - "name": "getImplementation", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getIncentivesController", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLSSVMRouter", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLendPool", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLendPoolConfigurator", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLendPoolLiquidator", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLendPoolLoan", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getMarketId", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getNFTOracle", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getNFTXVaultFactory", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getPoolAdmin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getReserveOracle", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getSushiSwapRouter", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getUIDataProvider", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getUNFTRegistry", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getUnlockdDataProvider", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getWalletBalanceProvider", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "id", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "newAddress", - "type": "address" - } - ], - "name": "setAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "id", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "implementationAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "encodedCallData", - "type": "bytes" - } - ], - "name": "setAddressAsProxy", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "emergencyAdmin", - "type": "address" - } - ], - "name": "setEmergencyAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "controller", - "type": "address" - } - ], - "name": "setIncentivesController", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "router", - "type": "address" - } - ], - "name": "setLSSVMRouter", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "configurator", - "type": "address" - }, - { - "internalType": "bytes", - "name": "encodedCallData", - "type": "bytes" - } - ], - "name": "setLendPoolConfiguratorImpl", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "pool", - "type": "address" - }, - { - "internalType": "bytes", - "name": "encodedCallData", - "type": "bytes" - } - ], - "name": "setLendPoolImpl", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "liquidator", - "type": "address" - } - ], - "name": "setLendPoolLiquidator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "loanAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "encodedCallData", - "type": "bytes" - } - ], - "name": "setLendPoolLoanImpl", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "marketId", - "type": "string" - } - ], - "name": "setMarketId", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "nftOracle", - "type": "address" - } - ], - "name": "setNFTOracle", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "factory", - "type": "address" - } - ], - "name": "setNFTXVaultFactory", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "admin", - "type": "address" - } - ], - "name": "setPoolAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "reserveOracle", - "type": "address" - } - ], - "name": "setReserveOracle", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "router", - "type": "address" - } - ], - "name": "setSushiSwapRouter", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "provider", - "type": "address" - } - ], - "name": "setUIDataProvider", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "factory", - "type": "address" - } - ], - "name": "setUNFTRegistry", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "provider", - "type": "address" - } - ], - "name": "setUnlockdDataProvider", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "provider", - "type": "address" - } - ], - "name": "setWalletBalanceProvider", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/unlockd-finance/contracts/abis/unlockd-finance-lend-pool.json b/src/apps/unlockd-finance/contracts/abis/unlockd-finance-lend-pool.json deleted file mode 100644 index 2a4082acc..000000000 --- a/src/apps/unlockd-finance/contracts/abis/unlockd-finance-lend-pool.json +++ /dev/null @@ -1,2100 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "reserve", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "bidPrice", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "onBehalfOf", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "borrower", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "loanId", - "type": "uint256" - } - ], - "name": "Auction", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "reserve", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "onBehalfOf", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "borrowRate", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "loanId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint16", - "name": "referral", - "type": "uint16" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "nftConfigFee", - "type": "uint256" - } - ], - "name": "Borrow", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "reserve", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "onBehalfOf", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint16", - "name": "referral", - "type": "uint16" - } - ], - "name": "Deposit", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "reserve", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "repayAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "remainAmount", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "borrower", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "loanId", - "type": "uint256" - } - ], - "name": "Liquidate", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "reserve", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "repayAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "remainAmount", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "borrower", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "loanId", - "type": "uint256" - } - ], - "name": "LiquidateNFTX", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "configuration", - "type": "uint256" - } - ], - "name": "NftConfigurationByIdChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "configuration", - "type": "uint256" - } - ], - "name": "NftConfigurationChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "startTime", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "durationTime", - "type": "uint256" - } - ], - "name": "PausedTimeUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "reserve", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "borrowAmount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "fineAmount", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "borrower", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "loanId", - "type": "uint256" - } - ], - "name": "Redeem", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "reserve", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "borrower", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "loanId", - "type": "uint256" - } - ], - "name": "Repay", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "newRescuer", - "type": "address" - } - ], - "name": "RescuerChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "configuration", - "type": "uint256" - } - ], - "name": "ReserveConfigurationChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "reserve", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "liquidityRate", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "variableBorrowRate", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "liquidityIndex", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "variableBorrowIndex", - "type": "uint256" - } - ], - "name": "ReserveDataUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "rateAddress", - "type": "address" - } - ], - "name": "ReserveInterestRateAddressChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "newSafeHealthFactor", - "type": "uint256" - } - ], - "name": "SafeHealthFactorUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "uToken", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "treasury", - "type": "address" - } - ], - "name": "TreasuryAddressUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "Unpaused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - } - ], - "name": "ValuationApproved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "reserve", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - } - ], - "name": "Withdraw", - "type": "event" - }, - { - "inputs": [], - "name": "ADDRESS_ID_PUNK_GATEWAY", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "ADDRESS_ID_WETH_GATEWAY", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "name": "_isMarketSupported", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - } - ], - "name": "approveValuation", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "bidPrice", - "type": "uint256" - }, - { - "internalType": "address", - "name": "onBehalfOf", - "type": "address" - } - ], - "name": "auction", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "onBehalfOf", - "type": "address" - }, - { - "internalType": "uint16", - "name": "referralCode", - "type": "uint16" - } - ], - "name": "borrow", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "address", - "name": "onBehalfOf", - "type": "address" - }, - { - "internalType": "uint16", - "name": "referralCode", - "type": "uint16" - } - ], - "name": "deposit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "finalizeTransfer", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getAddressesProvider", - "outputs": [ - { - "internalType": "contract ILendPoolAddressesProvider", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getAuctionDurationConfigFee", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getConfigFee", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint8", - "name": "market", - "type": "uint8" - } - ], - "name": "getIsMarketSupported", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLiquidateFeePercentage", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getMaxNumberOfNfts", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getMaxNumberOfReserves", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "getNftAssetConfig", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "data", - "type": "uint256" - } - ], - "internalType": "struct DataTypes.NftConfigurationMap", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - } - ], - "name": "getNftAuctionData", - "outputs": [ - { - "internalType": "uint256", - "name": "loanId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "bidderAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "bidPrice", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "bidBorrowAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "bidFine", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "reserveAsset", - "type": "address" - } - ], - "name": "getNftCollateralData", - "outputs": [ - { - "internalType": "uint256", - "name": "totalCollateralInETH", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalCollateralInReserve", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "availableBorrowsInETH", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "availableBorrowsInReserve", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "ltv", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "liquidationThreshold", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "liquidationBonus", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - } - ], - "name": "getNftConfigByTokenId", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "data", - "type": "uint256" - } - ], - "internalType": "struct DataTypes.NftConfigurationMap", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - } - ], - "name": "getNftConfiguration", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "data", - "type": "uint256" - } - ], - "internalType": "struct DataTypes.NftConfigurationMap", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - } - ], - "name": "getNftData", - "outputs": [ - { - "components": [ - { - "components": [ - { - "internalType": "uint256", - "name": "data", - "type": "uint256" - } - ], - "internalType": "struct DataTypes.NftConfigurationMap", - "name": "configuration", - "type": "tuple" - }, - { - "internalType": "address", - "name": "uNftAddress", - "type": "address" - }, - { - "internalType": "uint8", - "name": "id", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "maxSupply", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxTokenId", - "type": "uint256" - } - ], - "internalType": "struct DataTypes.NftData", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - } - ], - "name": "getNftDebtData", - "outputs": [ - { - "internalType": "uint256", - "name": "loanId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "reserveAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "totalCollateral", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalDebt", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "availableBorrows", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "healthFactor", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - } - ], - "name": "getNftLiquidatePrice", - "outputs": [ - { - "internalType": "uint256", - "name": "liquidatePrice", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "paybackAmount", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getNftsList", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getPausedTime", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - } - ], - "name": "getReserveConfiguration", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "data", - "type": "uint256" - } - ], - "internalType": "struct DataTypes.ReserveConfigurationMap", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - } - ], - "name": "getReserveData", - "outputs": [ - { - "components": [ - { - "components": [ - { - "internalType": "uint256", - "name": "data", - "type": "uint256" - } - ], - "internalType": "struct DataTypes.ReserveConfigurationMap", - "name": "configuration", - "type": "tuple" - }, - { - "internalType": "uint128", - "name": "liquidityIndex", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "variableBorrowIndex", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "currentLiquidityRate", - "type": "uint128" - }, - { - "internalType": "uint128", - "name": "currentVariableBorrowRate", - "type": "uint128" - }, - { - "internalType": "uint40", - "name": "lastUpdateTimestamp", - "type": "uint40" - }, - { - "internalType": "address", - "name": "uTokenAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "debtTokenAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "interestRateAddress", - "type": "address" - }, - { - "internalType": "uint8", - "name": "id", - "type": "uint8" - } - ], - "internalType": "struct DataTypes.ReserveData", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - } - ], - "name": "getReserveNormalizedIncome", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - } - ], - "name": "getReserveNormalizedVariableDebt", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getReservesList", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getSafeHealthFactor", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getTimeframe", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "internalType": "address", - "name": "uNftAddress", - "type": "address" - } - ], - "name": "initNft", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "internalType": "address", - "name": "uTokenAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "debtTokenAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "interestRateAddress", - "type": "address" - } - ], - "name": "initReserve", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract ILendPoolAddressesProvider", - "name": "provider", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "liquidate", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountOutMin", - "type": "uint256" - } - ], - "name": "liquidateNFTX", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amountOutMin", - "type": "uint256" - }, - { - "internalType": "address", - "name": "LSSVMPair", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amountOutMinSudoswap", - "type": "uint256" - } - ], - "name": "liquidateSudoSwap", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "", - "type": "bytes" - } - ], - "name": "onERC721Received", - "outputs": [ - { - "internalType": "bytes4", - "name": "", - "type": "bytes4" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "paused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "bidFine", - "type": "uint256" - } - ], - "name": "redeem", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "repay", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IERC20", - "name": "tokenContract", - "type": "address" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "rescueETH", - "type": "bool" - } - ], - "name": "rescue", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IERC721Upgradeable", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - } - ], - "name": "rescueNFT", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rescuer", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "auctionDurationConfigFee", - "type": "uint256" - } - ], - "name": "setAuctionDurationConfigFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "configFee", - "type": "uint256" - } - ], - "name": "setConfigFee", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint8", - "name": "market", - "type": "uint8" - }, - { - "internalType": "bool", - "name": "val", - "type": "bool" - } - ], - "name": "setIsMarketSupported", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "percentage", - "type": "uint256" - } - ], - "name": "setLiquidateFeePercentage", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "val", - "type": "uint256" - } - ], - "name": "setMaxNumberOfNfts", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "val", - "type": "uint256" - } - ], - "name": "setMaxNumberOfReserves", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "configuration", - "type": "uint256" - } - ], - "name": "setNftConfigByTokenId", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "configuration", - "type": "uint256" - } - ], - "name": "setNftConfiguration", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "maxSupply", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "maxTokenId", - "type": "uint256" - } - ], - "name": "setNftMaxSupplyAndTokenId", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bool", - "name": "val", - "type": "bool" - } - ], - "name": "setPause", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "startTime", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "durationTime", - "type": "uint256" - } - ], - "name": "setPausedTime", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "configuration", - "type": "uint256" - } - ], - "name": "setReserveConfiguration", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "internalType": "address", - "name": "rateAddress", - "type": "address" - } - ], - "name": "setReserveInterestRateAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "timeframe", - "type": "uint256" - } - ], - "name": "setTimeframe", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "uToken", - "type": "address" - }, - { - "internalType": "address", - "name": "treasury", - "type": "address" - } - ], - "name": "setTreasuryAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newRescuer", - "type": "address" - } - ], - "name": "updateRescuer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "newSafeHealthFactor", - "type": "uint256" - } - ], - "name": "updateSafeHealthFactor", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "address", - "name": "to", - "type": "address" - } - ], - "name": "withdraw", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } -] diff --git a/src/apps/unlockd-finance/contracts/abis/unlockd-finance-protocol-data-provider.json b/src/apps/unlockd-finance/contracts/abis/unlockd-finance-protocol-data-provider.json deleted file mode 100644 index e6847fc8e..000000000 --- a/src/apps/unlockd-finance/contracts/abis/unlockd-finance-protocol-data-provider.json +++ /dev/null @@ -1,678 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "contract ILendPoolAddressesProvider", - "name": "addressesProvider", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "ADDRESSES_PROVIDER", - "outputs": [ - { - "internalType": "contract ILendPoolAddressesProvider", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getAllNftsTokenDatas", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "nftSymbol", - "type": "string" - }, - { - "internalType": "address", - "name": "nftAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "uNftSymbol", - "type": "string" - }, - { - "internalType": "address", - "name": "uNftAddress", - "type": "address" - } - ], - "internalType": "struct UnlockdProtocolDataProvider.NftTokenData[]", - "name": "", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getAllReservesTokenDatas", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "tokenSymbol", - "type": "string" - }, - { - "internalType": "address", - "name": "tokenAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "uTokenSymbol", - "type": "string" - }, - { - "internalType": "address", - "name": "uTokenAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "debtTokenSymbol", - "type": "string" - }, - { - "internalType": "address", - "name": "debtTokenAddress", - "type": "address" - } - ], - "internalType": "struct UnlockdProtocolDataProvider.ReserveTokenData[]", - "name": "", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - } - ], - "name": "getLoanDataByCollateral", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "loanId", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "state", - "type": "uint8" - }, - { - "internalType": "address", - "name": "borrower", - "type": "address" - }, - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "reserveAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "scaledAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "currentAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "bidStartTimestamp", - "type": "uint256" - }, - { - "internalType": "address", - "name": "bidderAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "bidPrice", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "bidBorrowAmount", - "type": "uint256" - } - ], - "internalType": "struct UnlockdProtocolDataProvider.LoanData", - "name": "loanData", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "loanId", - "type": "uint256" - } - ], - "name": "getLoanDataByLoanId", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "loanId", - "type": "uint256" - }, - { - "internalType": "uint8", - "name": "state", - "type": "uint8" - }, - { - "internalType": "address", - "name": "borrower", - "type": "address" - }, - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "nftTokenId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "reserveAsset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "scaledAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "currentAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "bidStartTimestamp", - "type": "uint256" - }, - { - "internalType": "address", - "name": "bidderAddress", - "type": "address" - }, - { - "internalType": "uint256", - "name": "bidPrice", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "bidBorrowAmount", - "type": "uint256" - } - ], - "internalType": "struct UnlockdProtocolDataProvider.LoanData", - "name": "loanData", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "reserveAsset", - "type": "address" - } - ], - "name": "getNFTXPrice", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - } - ], - "name": "getNftConfigurationData", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "ltv", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "liquidationThreshold", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "liquidationBonus", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "redeemDuration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "auctionDuration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "redeemFine", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "redeemThreshold", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minBidFine", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "isActive", - "type": "bool" - }, - { - "internalType": "bool", - "name": "isFrozen", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "configTimestamp", - "type": "uint256" - } - ], - "internalType": "struct UnlockdProtocolDataProvider.NftConfigurationData", - "name": "configData", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "getNftConfigurationDataByTokenId", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "ltv", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "liquidationThreshold", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "liquidationBonus", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "redeemDuration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "auctionDuration", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "redeemFine", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "redeemThreshold", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "minBidFine", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "isActive", - "type": "bool" - }, - { - "internalType": "bool", - "name": "isFrozen", - "type": "bool" - }, - { - "internalType": "uint256", - "name": "configTimestamp", - "type": "uint256" - } - ], - "internalType": "struct UnlockdProtocolDataProvider.NftConfigurationData", - "name": "configData", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "nftAsset", - "type": "address" - } - ], - "name": "getNftTokenData", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "nftSymbol", - "type": "string" - }, - { - "internalType": "address", - "name": "nftAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "uNftSymbol", - "type": "string" - }, - { - "internalType": "address", - "name": "uNftAddress", - "type": "address" - } - ], - "internalType": "struct UnlockdProtocolDataProvider.NftTokenData", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - } - ], - "name": "getReserveConfigurationData", - "outputs": [ - { - "internalType": "uint256", - "name": "decimals", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "reserveFactor", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "borrowingEnabled", - "type": "bool" - }, - { - "internalType": "bool", - "name": "isActive", - "type": "bool" - }, - { - "internalType": "bool", - "name": "isFrozen", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - } - ], - "name": "getReserveData", - "outputs": [ - { - "internalType": "uint256", - "name": "availableLiquidity", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "totalVariableDebt", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "liquidityRate", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "variableBorrowRate", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "liquidityIndex", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "variableBorrowIndex", - "type": "uint256" - }, - { - "internalType": "uint40", - "name": "lastUpdateTimestamp", - "type": "uint40" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - } - ], - "name": "getReserveTokenData", - "outputs": [ - { - "components": [ - { - "internalType": "string", - "name": "tokenSymbol", - "type": "string" - }, - { - "internalType": "address", - "name": "tokenAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "uTokenSymbol", - "type": "string" - }, - { - "internalType": "address", - "name": "uTokenAddress", - "type": "address" - }, - { - "internalType": "string", - "name": "debtTokenSymbol", - "type": "string" - }, - { - "internalType": "address", - "name": "debtTokenAddress", - "type": "address" - } - ], - "internalType": "struct UnlockdProtocolDataProvider.ReserveTokenData", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "internalType": "address", - "name": "user", - "type": "address" - } - ], - "name": "getUserReserveData", - "outputs": [ - { - "internalType": "uint256", - "name": "currentUTokenBalance", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "currentVariableDebt", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "scaledVariableDebt", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "liquidityRate", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - } -] diff --git a/src/apps/unlockd-finance/contracts/abis/unlockd-finance-u-token.json b/src/apps/unlockd-finance/contracts/abis/unlockd-finance-u-token.json deleted file mode 100644 index 63a01a94e..000000000 --- a/src/apps/unlockd-finance/contracts/abis/unlockd-finance-u-token.json +++ /dev/null @@ -1,661 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Approval", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "BalanceTransfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "Burn", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "underlyingAsset", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "pool", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "treasury", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "incentivesController", - "type": "address" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "Mint", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "_newTreasuryAddress", - "type": "address" - } - ], - "name": "TreasuryAddressUpdated", - "type": "event" - }, - { - "inputs": [], - "name": "POOL", - "outputs": [ - { - "internalType": "contract ILendPool", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RESERVE_TREASURY_ADDRESS", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "UNDERLYING_ASSET_ADDRESS", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - }, - { - "internalType": "address", - "name": "spender", - "type": "address" - } - ], - "name": "allowance", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "approve", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "user", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "internalType": "address", - "name": "receiverOfUnderlying", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "burn", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "decimals", - "outputs": [ - { - "internalType": "uint8", - "name": "", - "type": "uint8" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "subtractedValue", - "type": "uint256" - } - ], - "name": "decreaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "getIncentivesController", - "outputs": [ - { - "internalType": "contract IIncentivesController", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "user", - "type": "address" - } - ], - "name": "getScaledUserBalanceAndSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "spender", - "type": "address" - }, - { - "internalType": "uint256", - "name": "addedValue", - "type": "uint256" - } - ], - "name": "increaseAllowance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract ILendPoolAddressesProvider", - "name": "addressProvider", - "type": "address" - }, - { - "internalType": "address", - "name": "treasury", - "type": "address" - }, - { - "internalType": "address", - "name": "underlyingAsset", - "type": "address" - }, - { - "internalType": "uint8", - "name": "uTokenDecimals", - "type": "uint8" - }, - { - "internalType": "string", - "name": "uTokenName", - "type": "string" - }, - { - "internalType": "string", - "name": "uTokenSymbol", - "type": "string" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "mint", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "mintToTreasury", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "name", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "user", - "type": "address" - } - ], - "name": "scaledBalanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "scaledTotalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "treasury", - "type": "address" - } - ], - "name": "setTreasuryAddress", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "symbol", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "target", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferUnderlyingTo", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/src/apps/unlockd-finance/contracts/index.ts b/src/apps/unlockd-finance/contracts/index.ts deleted file mode 100644 index 5dcfebdf6..000000000 --- a/src/apps/unlockd-finance/contracts/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -export * from './viem.contract-factory'; diff --git a/src/apps/unlockd-finance/contracts/viem.contract-factory.ts b/src/apps/unlockd-finance/contracts/viem.contract-factory.ts deleted file mode 100644 index 48e564b2d..000000000 --- a/src/apps/unlockd-finance/contracts/viem.contract-factory.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Injectable, Inject } from '@nestjs/common'; - -import { IAppToolkit, APP_TOOLKIT } from '~app-toolkit/app-toolkit.interface'; -import { Network } from '~types/network.interface'; - -import { - UnlockdFinanceDebtToken__factory, - UnlockdFinanceLendPool__factory, - UnlockdFinanceLendPoolAddressesProvider__factory, - UnlockdFinanceProtocolDataProvider__factory, - UnlockdFinanceUToken__factory, -} from './viem'; - -type ContractOpts = { address: string; network: Network }; - -@Injectable() -export class UnlockdFinanceViemContractFactory { - constructor(@Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit) {} - - unlockdFinanceDebtToken({ address, network }: ContractOpts) { - return UnlockdFinanceDebtToken__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - unlockdFinanceLendPool({ address, network }: ContractOpts) { - return UnlockdFinanceLendPool__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } - unlockdFinanceLendPoolAddressesProvider({ address, network }: ContractOpts) { - return UnlockdFinanceLendPoolAddressesProvider__factory.connect( - address, - this.appToolkit.getViemNetworkProvider(network), - ); - } - unlockdFinanceProtocolDataProvider({ address, network }: ContractOpts) { - return UnlockdFinanceProtocolDataProvider__factory.connect( - address, - this.appToolkit.getViemNetworkProvider(network), - ); - } - unlockdFinanceUToken({ address, network }: ContractOpts) { - return UnlockdFinanceUToken__factory.connect(address, this.appToolkit.getViemNetworkProvider(network)); - } -} diff --git a/src/apps/unlockd-finance/contracts/viem/UnlockdFinanceDebtToken.ts b/src/apps/unlockd-finance/contracts/viem/UnlockdFinanceDebtToken.ts deleted file mode 100644 index c0691c324..000000000 --- a/src/apps/unlockd-finance/contracts/viem/UnlockdFinanceDebtToken.ts +++ /dev/null @@ -1,637 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const unlockdFinanceDebtTokenAbi = [ - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'fromUser', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'toUser', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'BorrowAllowanceDelegated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'user', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - ], - name: 'Burn', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'underlyingAsset', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'pool', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: 'incentivesController', - type: 'address', - }, - { - indexed: false, - internalType: 'uint8', - name: 'debtTokenDecimals', - type: 'uint8', - }, - { - indexed: false, - internalType: 'string', - name: 'debtTokenName', - type: 'string', - }, - { - indexed: false, - internalType: 'string', - name: 'debtTokenSymbol', - type: 'string', - }, - ], - name: 'Initialized', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - ], - name: 'Mint', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - inputs: [], - name: 'POOL', - outputs: [ - { - internalType: 'contract ILendPool', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'UNDERLYING_ASSET_ADDRESS', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'delegatee', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approveDelegation', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'fromUser', - type: 'address', - }, - { - internalType: 'address', - name: 'toUser', - type: 'address', - }, - ], - name: 'borrowAllowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - ], - name: 'burn', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'subtractedValue', - type: 'uint256', - }, - ], - name: 'decreaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'getIncentivesController', - outputs: [ - { - internalType: 'contract IIncentivesController', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - ], - name: 'getScaledUserBalanceAndSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'addedValue', - type: 'uint256', - }, - ], - name: 'increaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'contract ILendPoolAddressesProvider', - name: 'addressProvider', - type: 'address', - }, - { - internalType: 'address', - name: 'underlyingAsset', - type: 'address', - }, - { - internalType: 'uint8', - name: 'debtTokenDecimals', - type: 'uint8', - }, - { - internalType: 'string', - name: 'debtTokenName', - type: 'string', - }, - { - internalType: 'string', - name: 'debtTokenSymbol', - type: 'string', - }, - ], - name: 'initialize', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'initiator', - type: 'address', - }, - { - internalType: 'address', - name: 'onBehalfOf', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - ], - name: 'mint', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - ], - name: 'scaledBalanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'scaledTotalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type UnlockdFinanceDebtToken = typeof unlockdFinanceDebtTokenAbi; -export type UnlockdFinanceDebtTokenContract = GetContractReturnType; - -export class UnlockdFinanceDebtToken__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: unlockdFinanceDebtTokenAbi, publicClient: client }); - } -} diff --git a/src/apps/unlockd-finance/contracts/viem/UnlockdFinanceLendPool.ts b/src/apps/unlockd-finance/contracts/viem/UnlockdFinanceLendPool.ts deleted file mode 100644 index f48a04df1..000000000 --- a/src/apps/unlockd-finance/contracts/viem/UnlockdFinanceLendPool.ts +++ /dev/null @@ -1,2114 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const unlockdFinanceLendPoolAbi = [ - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'user', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'reserve', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'bidPrice', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - indexed: false, - internalType: 'address', - name: 'onBehalfOf', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'borrower', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'loanId', - type: 'uint256', - }, - ], - name: 'Auction', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'user', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'reserve', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - indexed: false, - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'onBehalfOf', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'borrowRate', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'loanId', - type: 'uint256', - }, - { - indexed: true, - internalType: 'uint16', - name: 'referral', - type: 'uint16', - }, - { - indexed: false, - internalType: 'uint256', - name: 'nftConfigFee', - type: 'uint256', - }, - ], - name: 'Borrow', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'user', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'reserve', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'onBehalfOf', - type: 'address', - }, - { - indexed: true, - internalType: 'uint16', - name: 'referral', - type: 'uint16', - }, - ], - name: 'Deposit', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'user', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'reserve', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'repayAmount', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'remainAmount', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'borrower', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'loanId', - type: 'uint256', - }, - ], - name: 'Liquidate', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'reserve', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'repayAmount', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'remainAmount', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'borrower', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'loanId', - type: 'uint256', - }, - ], - name: 'LiquidateNFTX', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - indexed: true, - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'configuration', - type: 'uint256', - }, - ], - name: 'NftConfigurationByIdChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'configuration', - type: 'uint256', - }, - ], - name: 'NftConfigurationChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [], - name: 'Paused', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'uint256', - name: 'startTime', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'durationTime', - type: 'uint256', - }, - ], - name: 'PausedTimeUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'user', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'reserve', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'borrowAmount', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'fineAmount', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'borrower', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'loanId', - type: 'uint256', - }, - ], - name: 'Redeem', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'address', - name: 'user', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'reserve', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'borrower', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'loanId', - type: 'uint256', - }, - ], - name: 'Repay', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newRescuer', - type: 'address', - }, - ], - name: 'RescuerChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'configuration', - type: 'uint256', - }, - ], - name: 'ReserveConfigurationChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'reserve', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'liquidityRate', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'variableBorrowRate', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'liquidityIndex', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'variableBorrowIndex', - type: 'uint256', - }, - ], - name: 'ReserveDataUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'rateAddress', - type: 'address', - }, - ], - name: 'ReserveInterestRateAddressChanged', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'uint256', - name: 'newSafeHealthFactor', - type: 'uint256', - }, - ], - name: 'SafeHealthFactorUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'uToken', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'treasury', - type: 'address', - }, - ], - name: 'TreasuryAddressUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [], - name: 'Unpaused', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'user', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - indexed: true, - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - ], - name: 'ValuationApproved', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'user', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'reserve', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - ], - name: 'Withdraw', - type: 'event', - }, - { - inputs: [], - name: 'ADDRESS_ID_PUNK_GATEWAY', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'ADDRESS_ID_WETH_GATEWAY', - outputs: [ - { - internalType: 'bytes32', - name: '', - type: 'bytes32', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - name: '_isMarketSupported', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - ], - name: 'approveValuation', - outputs: [], - stateMutability: 'payable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'bidPrice', - type: 'uint256', - }, - { - internalType: 'address', - name: 'onBehalfOf', - type: 'address', - }, - ], - name: 'auction', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - internalType: 'address', - name: 'onBehalfOf', - type: 'address', - }, - { - internalType: 'uint16', - name: 'referralCode', - type: 'uint16', - }, - ], - name: 'borrow', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'address', - name: 'onBehalfOf', - type: 'address', - }, - { - internalType: 'uint16', - name: 'referralCode', - type: 'uint16', - }, - ], - name: 'deposit', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - internalType: 'address', - name: 'from', - type: 'address', - }, - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - name: 'finalizeTransfer', - outputs: [], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getAddressesProvider', - outputs: [ - { - internalType: 'contract ILendPoolAddressesProvider', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getAuctionDurationConfigFee', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getConfigFee', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint8', - name: 'market', - type: 'uint8', - }, - ], - name: 'getIsMarketSupported', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getLiquidateFeePercentage', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getMaxNumberOfNfts', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getMaxNumberOfReserves', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'tokenId', - type: 'uint256', - }, - ], - name: 'getNftAssetConfig', - outputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'data', - type: 'uint256', - }, - ], - internalType: 'struct DataTypes.NftConfigurationMap', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - ], - name: 'getNftAuctionData', - outputs: [ - { - internalType: 'uint256', - name: 'loanId', - type: 'uint256', - }, - { - internalType: 'address', - name: 'bidderAddress', - type: 'address', - }, - { - internalType: 'uint256', - name: 'bidPrice', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'bidBorrowAmount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'bidFine', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - internalType: 'address', - name: 'reserveAsset', - type: 'address', - }, - ], - name: 'getNftCollateralData', - outputs: [ - { - internalType: 'uint256', - name: 'totalCollateralInETH', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalCollateralInReserve', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'availableBorrowsInETH', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'availableBorrowsInReserve', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'ltv', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'liquidationThreshold', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'liquidationBonus', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - ], - name: 'getNftConfigByTokenId', - outputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'data', - type: 'uint256', - }, - ], - internalType: 'struct DataTypes.NftConfigurationMap', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - ], - name: 'getNftConfiguration', - outputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'data', - type: 'uint256', - }, - ], - internalType: 'struct DataTypes.NftConfigurationMap', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - ], - name: 'getNftData', - outputs: [ - { - components: [ - { - components: [ - { - internalType: 'uint256', - name: 'data', - type: 'uint256', - }, - ], - internalType: 'struct DataTypes.NftConfigurationMap', - name: 'configuration', - type: 'tuple', - }, - { - internalType: 'address', - name: 'uNftAddress', - type: 'address', - }, - { - internalType: 'uint8', - name: 'id', - type: 'uint8', - }, - { - internalType: 'uint256', - name: 'maxSupply', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'maxTokenId', - type: 'uint256', - }, - ], - internalType: 'struct DataTypes.NftData', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - ], - name: 'getNftDebtData', - outputs: [ - { - internalType: 'uint256', - name: 'loanId', - type: 'uint256', - }, - { - internalType: 'address', - name: 'reserveAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'totalCollateral', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalDebt', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'availableBorrows', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'healthFactor', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - ], - name: 'getNftLiquidatePrice', - outputs: [ - { - internalType: 'uint256', - name: 'liquidatePrice', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'paybackAmount', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getNftsList', - outputs: [ - { - internalType: 'address[]', - name: '', - type: 'address[]', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getPausedTime', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - ], - name: 'getReserveConfiguration', - outputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'data', - type: 'uint256', - }, - ], - internalType: 'struct DataTypes.ReserveConfigurationMap', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - ], - name: 'getReserveData', - outputs: [ - { - components: [ - { - components: [ - { - internalType: 'uint256', - name: 'data', - type: 'uint256', - }, - ], - internalType: 'struct DataTypes.ReserveConfigurationMap', - name: 'configuration', - type: 'tuple', - }, - { - internalType: 'uint128', - name: 'liquidityIndex', - type: 'uint128', - }, - { - internalType: 'uint128', - name: 'variableBorrowIndex', - type: 'uint128', - }, - { - internalType: 'uint128', - name: 'currentLiquidityRate', - type: 'uint128', - }, - { - internalType: 'uint128', - name: 'currentVariableBorrowRate', - type: 'uint128', - }, - { - internalType: 'uint40', - name: 'lastUpdateTimestamp', - type: 'uint40', - }, - { - internalType: 'address', - name: 'uTokenAddress', - type: 'address', - }, - { - internalType: 'address', - name: 'debtTokenAddress', - type: 'address', - }, - { - internalType: 'address', - name: 'interestRateAddress', - type: 'address', - }, - { - internalType: 'uint8', - name: 'id', - type: 'uint8', - }, - ], - internalType: 'struct DataTypes.ReserveData', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - ], - name: 'getReserveNormalizedIncome', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - ], - name: 'getReserveNormalizedVariableDebt', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getReservesList', - outputs: [ - { - internalType: 'address[]', - name: '', - type: 'address[]', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getSafeHealthFactor', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getTimeframe', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - internalType: 'address', - name: 'uNftAddress', - type: 'address', - }, - ], - name: 'initNft', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - internalType: 'address', - name: 'uTokenAddress', - type: 'address', - }, - { - internalType: 'address', - name: 'debtTokenAddress', - type: 'address', - }, - { - internalType: 'address', - name: 'interestRateAddress', - type: 'address', - }, - ], - name: 'initReserve', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'contract ILendPoolAddressesProvider', - name: 'provider', - type: 'address', - }, - ], - name: 'initialize', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'liquidate', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'amountOutMin', - type: 'uint256', - }, - ], - name: 'liquidateNFTX', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'amountOutMin', - type: 'uint256', - }, - { - internalType: 'address', - name: 'LSSVMPair', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amountOutMinSudoswap', - type: 'uint256', - }, - ], - name: 'liquidateSudoSwap', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'address', - name: '', - type: 'address', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - { - internalType: 'bytes', - name: '', - type: 'bytes', - }, - ], - name: 'onERC721Received', - outputs: [ - { - internalType: 'bytes4', - name: '', - type: 'bytes4', - }, - ], - stateMutability: 'pure', - type: 'function', - }, - { - inputs: [], - name: 'paused', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'bidFine', - type: 'uint256', - }, - ], - name: 'redeem', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'repay', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'contract IERC20', - name: 'tokenContract', - type: 'address', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'bool', - name: 'rescueETH', - type: 'bool', - }, - ], - name: 'rescue', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'contract IERC721Upgradeable', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'tokenId', - type: 'uint256', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - ], - name: 'rescueNFT', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'rescuer', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'auctionDurationConfigFee', - type: 'uint256', - }, - ], - name: 'setAuctionDurationConfigFee', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'configFee', - type: 'uint256', - }, - ], - name: 'setConfigFee', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint8', - name: 'market', - type: 'uint8', - }, - { - internalType: 'bool', - name: 'val', - type: 'bool', - }, - ], - name: 'setIsMarketSupported', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'percentage', - type: 'uint256', - }, - ], - name: 'setLiquidateFeePercentage', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'val', - type: 'uint256', - }, - ], - name: 'setMaxNumberOfNfts', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'val', - type: 'uint256', - }, - ], - name: 'setMaxNumberOfReserves', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'configuration', - type: 'uint256', - }, - ], - name: 'setNftConfigByTokenId', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'configuration', - type: 'uint256', - }, - ], - name: 'setNftConfiguration', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'maxSupply', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'maxTokenId', - type: 'uint256', - }, - ], - name: 'setNftMaxSupplyAndTokenId', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bool', - name: 'val', - type: 'bool', - }, - ], - name: 'setPause', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'startTime', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'durationTime', - type: 'uint256', - }, - ], - name: 'setPausedTime', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'configuration', - type: 'uint256', - }, - ], - name: 'setReserveConfiguration', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - internalType: 'address', - name: 'rateAddress', - type: 'address', - }, - ], - name: 'setReserveInterestRateAddress', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'timeframe', - type: 'uint256', - }, - ], - name: 'setTimeframe', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'uToken', - type: 'address', - }, - { - internalType: 'address', - name: 'treasury', - type: 'address', - }, - ], - name: 'setTreasuryAddress', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newRescuer', - type: 'address', - }, - ], - name: 'updateRescuer', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'newSafeHealthFactor', - type: 'uint256', - }, - ], - name: 'updateSafeHealthFactor', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'address', - name: 'to', - type: 'address', - }, - ], - name: 'withdraw', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - stateMutability: 'payable', - type: 'receive', - }, -] as const; - -export type UnlockdFinanceLendPool = typeof unlockdFinanceLendPoolAbi; -export type UnlockdFinanceLendPoolContract = GetContractReturnType; - -export class UnlockdFinanceLendPool__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: unlockdFinanceLendPoolAbi, publicClient: client }); - } -} diff --git a/src/apps/unlockd-finance/contracts/viem/UnlockdFinanceLendPoolAddressesProvider.ts b/src/apps/unlockd-finance/contracts/viem/UnlockdFinanceLendPoolAddressesProvider.ts deleted file mode 100644 index b3f907555..000000000 --- a/src/apps/unlockd-finance/contracts/viem/UnlockdFinanceLendPoolAddressesProvider.ts +++ /dev/null @@ -1,920 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const unlockdFinanceLendPoolAddressesProviderAbi = [ - { - inputs: [ - { - internalType: 'string', - name: 'marketId', - type: 'string', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'bytes32', - name: 'id', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - { - indexed: false, - internalType: 'bool', - name: 'hasProxy', - type: 'bool', - }, - { - indexed: false, - internalType: 'bytes', - name: 'encodedCallData', - type: 'bytes', - }, - ], - name: 'AddressSet', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - ], - name: 'ConfigurationAdminUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - ], - name: 'EmergencyAdminUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - ], - name: 'IncentivesControllerUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - ], - name: 'LSSVMRouterUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - { - indexed: false, - internalType: 'bytes', - name: 'encodedCallData', - type: 'bytes', - }, - ], - name: 'LendPoolConfiguratorUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - ], - name: 'LendPoolLiquidatorUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - { - indexed: false, - internalType: 'bytes', - name: 'encodedCallData', - type: 'bytes', - }, - ], - name: 'LendPoolLoanUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - { - indexed: false, - internalType: 'bytes', - name: 'encodedCallData', - type: 'bytes', - }, - ], - name: 'LendPoolUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - ], - name: 'LtvManagerUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'string', - name: 'newMarketId', - type: 'string', - }, - ], - name: 'MarketIdSet', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - ], - name: 'NFTXVaultFactoryUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - ], - name: 'NftOracleUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'previousOwner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'OwnershipTransferred', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: 'bytes32', - name: 'id', - type: 'bytes32', - }, - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - ], - name: 'ProxyCreated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - ], - name: 'ReserveOracleUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - ], - name: 'SushiSwapRouterUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - ], - name: 'UIDataProviderUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - ], - name: 'UNFTRegistryUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - ], - name: 'UnlockdDataProviderUpdated', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - ], - name: 'WalletBalanceProviderUpdated', - type: 'event', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'id', - type: 'bytes32', - }, - ], - name: 'getAddress', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getEmergencyAdmin', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'proxyAddress', - type: 'address', - }, - ], - name: 'getImplementation', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getIncentivesController', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getLSSVMRouter', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getLendPool', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getLendPoolConfigurator', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getLendPoolLiquidator', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getLendPoolLoan', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getMarketId', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getNFTOracle', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getNFTXVaultFactory', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getPoolAdmin', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getReserveOracle', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getSushiSwapRouter', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getUIDataProvider', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getUNFTRegistry', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getUnlockdDataProvider', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getWalletBalanceProvider', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'owner', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'renounceOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'id', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'newAddress', - type: 'address', - }, - ], - name: 'setAddress', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'bytes32', - name: 'id', - type: 'bytes32', - }, - { - internalType: 'address', - name: 'implementationAddress', - type: 'address', - }, - { - internalType: 'bytes', - name: 'encodedCallData', - type: 'bytes', - }, - ], - name: 'setAddressAsProxy', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'emergencyAdmin', - type: 'address', - }, - ], - name: 'setEmergencyAdmin', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'controller', - type: 'address', - }, - ], - name: 'setIncentivesController', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'router', - type: 'address', - }, - ], - name: 'setLSSVMRouter', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'configurator', - type: 'address', - }, - { - internalType: 'bytes', - name: 'encodedCallData', - type: 'bytes', - }, - ], - name: 'setLendPoolConfiguratorImpl', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'pool', - type: 'address', - }, - { - internalType: 'bytes', - name: 'encodedCallData', - type: 'bytes', - }, - ], - name: 'setLendPoolImpl', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'liquidator', - type: 'address', - }, - ], - name: 'setLendPoolLiquidator', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'loanAddress', - type: 'address', - }, - { - internalType: 'bytes', - name: 'encodedCallData', - type: 'bytes', - }, - ], - name: 'setLendPoolLoanImpl', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'string', - name: 'marketId', - type: 'string', - }, - ], - name: 'setMarketId', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'nftOracle', - type: 'address', - }, - ], - name: 'setNFTOracle', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'factory', - type: 'address', - }, - ], - name: 'setNFTXVaultFactory', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'admin', - type: 'address', - }, - ], - name: 'setPoolAdmin', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'reserveOracle', - type: 'address', - }, - ], - name: 'setReserveOracle', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'router', - type: 'address', - }, - ], - name: 'setSushiSwapRouter', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'provider', - type: 'address', - }, - ], - name: 'setUIDataProvider', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'factory', - type: 'address', - }, - ], - name: 'setUNFTRegistry', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'provider', - type: 'address', - }, - ], - name: 'setUnlockdDataProvider', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'provider', - type: 'address', - }, - ], - name: 'setWalletBalanceProvider', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'newOwner', - type: 'address', - }, - ], - name: 'transferOwnership', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type UnlockdFinanceLendPoolAddressesProvider = typeof unlockdFinanceLendPoolAddressesProviderAbi; -export type UnlockdFinanceLendPoolAddressesProviderContract = GetContractReturnType< - UnlockdFinanceLendPoolAddressesProvider, - PublicClient ->; - -export class UnlockdFinanceLendPoolAddressesProvider__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: unlockdFinanceLendPoolAddressesProviderAbi, publicClient: client }); - } -} diff --git a/src/apps/unlockd-finance/contracts/viem/UnlockdFinanceProtocolDataProvider.ts b/src/apps/unlockd-finance/contracts/viem/UnlockdFinanceProtocolDataProvider.ts deleted file mode 100644 index ea6f35701..000000000 --- a/src/apps/unlockd-finance/contracts/viem/UnlockdFinanceProtocolDataProvider.ts +++ /dev/null @@ -1,695 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const unlockdFinanceProtocolDataProviderAbi = [ - { - inputs: [ - { - internalType: 'contract ILendPoolAddressesProvider', - name: 'addressesProvider', - type: 'address', - }, - ], - stateMutability: 'nonpayable', - type: 'constructor', - }, - { - inputs: [], - name: 'ADDRESSES_PROVIDER', - outputs: [ - { - internalType: 'contract ILendPoolAddressesProvider', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getAllNftsTokenDatas', - outputs: [ - { - components: [ - { - internalType: 'string', - name: 'nftSymbol', - type: 'string', - }, - { - internalType: 'address', - name: 'nftAddress', - type: 'address', - }, - { - internalType: 'string', - name: 'uNftSymbol', - type: 'string', - }, - { - internalType: 'address', - name: 'uNftAddress', - type: 'address', - }, - ], - internalType: 'struct UnlockdProtocolDataProvider.NftTokenData[]', - name: '', - type: 'tuple[]', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'getAllReservesTokenDatas', - outputs: [ - { - components: [ - { - internalType: 'string', - name: 'tokenSymbol', - type: 'string', - }, - { - internalType: 'address', - name: 'tokenAddress', - type: 'address', - }, - { - internalType: 'string', - name: 'uTokenSymbol', - type: 'string', - }, - { - internalType: 'address', - name: 'uTokenAddress', - type: 'address', - }, - { - internalType: 'string', - name: 'debtTokenSymbol', - type: 'string', - }, - { - internalType: 'address', - name: 'debtTokenAddress', - type: 'address', - }, - ], - internalType: 'struct UnlockdProtocolDataProvider.ReserveTokenData[]', - name: '', - type: 'tuple[]', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - ], - name: 'getLoanDataByCollateral', - outputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'loanId', - type: 'uint256', - }, - { - internalType: 'uint8', - name: 'state', - type: 'uint8', - }, - { - internalType: 'address', - name: 'borrower', - type: 'address', - }, - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - internalType: 'address', - name: 'reserveAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'scaledAmount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'currentAmount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'bidStartTimestamp', - type: 'uint256', - }, - { - internalType: 'address', - name: 'bidderAddress', - type: 'address', - }, - { - internalType: 'uint256', - name: 'bidPrice', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'bidBorrowAmount', - type: 'uint256', - }, - ], - internalType: 'struct UnlockdProtocolDataProvider.LoanData', - name: 'loanData', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'loanId', - type: 'uint256', - }, - ], - name: 'getLoanDataByLoanId', - outputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'loanId', - type: 'uint256', - }, - { - internalType: 'uint8', - name: 'state', - type: 'uint8', - }, - { - internalType: 'address', - name: 'borrower', - type: 'address', - }, - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'nftTokenId', - type: 'uint256', - }, - { - internalType: 'address', - name: 'reserveAsset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'scaledAmount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'currentAmount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'bidStartTimestamp', - type: 'uint256', - }, - { - internalType: 'address', - name: 'bidderAddress', - type: 'address', - }, - { - internalType: 'uint256', - name: 'bidPrice', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'bidBorrowAmount', - type: 'uint256', - }, - ], - internalType: 'struct UnlockdProtocolDataProvider.LoanData', - name: 'loanData', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'tokenId', - type: 'uint256', - }, - { - internalType: 'address', - name: 'reserveAsset', - type: 'address', - }, - ], - name: 'getNFTXPrice', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - ], - name: 'getNftConfigurationData', - outputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'ltv', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'liquidationThreshold', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'liquidationBonus', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'redeemDuration', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'auctionDuration', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'redeemFine', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'redeemThreshold', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'minBidFine', - type: 'uint256', - }, - { - internalType: 'bool', - name: 'isActive', - type: 'bool', - }, - { - internalType: 'bool', - name: 'isFrozen', - type: 'bool', - }, - { - internalType: 'uint256', - name: 'configTimestamp', - type: 'uint256', - }, - ], - internalType: 'struct UnlockdProtocolDataProvider.NftConfigurationData', - name: 'configData', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - internalType: 'uint256', - name: 'tokenId', - type: 'uint256', - }, - ], - name: 'getNftConfigurationDataByTokenId', - outputs: [ - { - components: [ - { - internalType: 'uint256', - name: 'ltv', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'liquidationThreshold', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'liquidationBonus', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'redeemDuration', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'auctionDuration', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'redeemFine', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'redeemThreshold', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'minBidFine', - type: 'uint256', - }, - { - internalType: 'bool', - name: 'isActive', - type: 'bool', - }, - { - internalType: 'bool', - name: 'isFrozen', - type: 'bool', - }, - { - internalType: 'uint256', - name: 'configTimestamp', - type: 'uint256', - }, - ], - internalType: 'struct UnlockdProtocolDataProvider.NftConfigurationData', - name: 'configData', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'nftAsset', - type: 'address', - }, - ], - name: 'getNftTokenData', - outputs: [ - { - components: [ - { - internalType: 'string', - name: 'nftSymbol', - type: 'string', - }, - { - internalType: 'address', - name: 'nftAddress', - type: 'address', - }, - { - internalType: 'string', - name: 'uNftSymbol', - type: 'string', - }, - { - internalType: 'address', - name: 'uNftAddress', - type: 'address', - }, - ], - internalType: 'struct UnlockdProtocolDataProvider.NftTokenData', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - ], - name: 'getReserveConfigurationData', - outputs: [ - { - internalType: 'uint256', - name: 'decimals', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'reserveFactor', - type: 'uint256', - }, - { - internalType: 'bool', - name: 'borrowingEnabled', - type: 'bool', - }, - { - internalType: 'bool', - name: 'isActive', - type: 'bool', - }, - { - internalType: 'bool', - name: 'isFrozen', - type: 'bool', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - ], - name: 'getReserveData', - outputs: [ - { - internalType: 'uint256', - name: 'availableLiquidity', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'totalVariableDebt', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'liquidityRate', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'variableBorrowRate', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'liquidityIndex', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'variableBorrowIndex', - type: 'uint256', - }, - { - internalType: 'uint40', - name: 'lastUpdateTimestamp', - type: 'uint40', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - ], - name: 'getReserveTokenData', - outputs: [ - { - components: [ - { - internalType: 'string', - name: 'tokenSymbol', - type: 'string', - }, - { - internalType: 'address', - name: 'tokenAddress', - type: 'address', - }, - { - internalType: 'string', - name: 'uTokenSymbol', - type: 'string', - }, - { - internalType: 'address', - name: 'uTokenAddress', - type: 'address', - }, - { - internalType: 'string', - name: 'debtTokenSymbol', - type: 'string', - }, - { - internalType: 'address', - name: 'debtTokenAddress', - type: 'address', - }, - ], - internalType: 'struct UnlockdProtocolDataProvider.ReserveTokenData', - name: '', - type: 'tuple', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'asset', - type: 'address', - }, - { - internalType: 'address', - name: 'user', - type: 'address', - }, - ], - name: 'getUserReserveData', - outputs: [ - { - internalType: 'uint256', - name: 'currentUTokenBalance', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'currentVariableDebt', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'scaledVariableDebt', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'liquidityRate', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, -] as const; - -export type UnlockdFinanceProtocolDataProvider = typeof unlockdFinanceProtocolDataProviderAbi; -export type UnlockdFinanceProtocolDataProviderContract = GetContractReturnType< - UnlockdFinanceProtocolDataProvider, - PublicClient ->; - -export class UnlockdFinanceProtocolDataProvider__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: unlockdFinanceProtocolDataProviderAbi, publicClient: client }); - } -} diff --git a/src/apps/unlockd-finance/contracts/viem/UnlockdFinanceUToken.ts b/src/apps/unlockd-finance/contracts/viem/UnlockdFinanceUToken.ts deleted file mode 100644 index 9e8243a40..000000000 --- a/src/apps/unlockd-finance/contracts/viem/UnlockdFinanceUToken.ts +++ /dev/null @@ -1,675 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { getContract, GetContractReturnType, PublicClient } from 'viem'; - -export const unlockdFinanceUTokenAbi = [ - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Approval', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - ], - name: 'BalanceTransfer', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'target', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - ], - name: 'Burn', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'underlyingAsset', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'pool', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: 'treasury', - type: 'address', - }, - { - indexed: false, - internalType: 'address', - name: 'incentivesController', - type: 'address', - }, - ], - name: 'Initialized', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - { - indexed: false, - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - ], - name: 'Mint', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: 'from', - type: 'address', - }, - { - indexed: true, - internalType: 'address', - name: 'to', - type: 'address', - }, - { - indexed: false, - internalType: 'uint256', - name: 'value', - type: 'uint256', - }, - ], - name: 'Transfer', - type: 'event', - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: 'address', - name: '_newTreasuryAddress', - type: 'address', - }, - ], - name: 'TreasuryAddressUpdated', - type: 'event', - }, - { - inputs: [], - name: 'POOL', - outputs: [ - { - internalType: 'contract ILendPool', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'RESERVE_TREASURY_ADDRESS', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'UNDERLYING_ASSET_ADDRESS', - outputs: [ - { - internalType: 'address', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'owner', - type: 'address', - }, - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - ], - name: 'allowance', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'approve', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - ], - name: 'balanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - { - internalType: 'address', - name: 'receiverOfUnderlying', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - ], - name: 'burn', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'decimals', - outputs: [ - { - internalType: 'uint8', - name: '', - type: 'uint8', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'subtractedValue', - type: 'uint256', - }, - ], - name: 'decreaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'getIncentivesController', - outputs: [ - { - internalType: 'contract IIncentivesController', - name: '', - type: 'address', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - ], - name: 'getScaledUserBalanceAndSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'spender', - type: 'address', - }, - { - internalType: 'uint256', - name: 'addedValue', - type: 'uint256', - }, - ], - name: 'increaseAllowance', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'contract ILendPoolAddressesProvider', - name: 'addressProvider', - type: 'address', - }, - { - internalType: 'address', - name: 'treasury', - type: 'address', - }, - { - internalType: 'address', - name: 'underlyingAsset', - type: 'address', - }, - { - internalType: 'uint8', - name: 'uTokenDecimals', - type: 'uint8', - }, - { - internalType: 'string', - name: 'uTokenName', - type: 'string', - }, - { - internalType: 'string', - name: 'uTokenSymbol', - type: 'string', - }, - ], - name: 'initialize', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - ], - name: 'mint', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - { - internalType: 'uint256', - name: 'index', - type: 'uint256', - }, - ], - name: 'mintToTreasury', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'name', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'user', - type: 'address', - }, - ], - name: 'scaledBalanceOf', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'scaledTotalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'treasury', - type: 'address', - }, - ], - name: 'setTreasuryAddress', - outputs: [], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [], - name: 'symbol', - outputs: [ - { - internalType: 'string', - name: '', - type: 'string', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [], - name: 'totalSupply', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'view', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transfer', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'sender', - type: 'address', - }, - { - internalType: 'address', - name: 'recipient', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferFrom', - outputs: [ - { - internalType: 'bool', - name: '', - type: 'bool', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, - { - inputs: [ - { - internalType: 'address', - name: 'target', - type: 'address', - }, - { - internalType: 'uint256', - name: 'amount', - type: 'uint256', - }, - ], - name: 'transferUnderlyingTo', - outputs: [ - { - internalType: 'uint256', - name: '', - type: 'uint256', - }, - ], - stateMutability: 'nonpayable', - type: 'function', - }, -] as const; - -export type UnlockdFinanceUToken = typeof unlockdFinanceUTokenAbi; -export type UnlockdFinanceUTokenContract = GetContractReturnType; - -export class UnlockdFinanceUToken__factory { - static connect(address: string, client: PublicClient) { - return getContract({ address, abi: unlockdFinanceUTokenAbi, publicClient: client }); - } -} diff --git a/src/apps/unlockd-finance/contracts/viem/index.ts b/src/apps/unlockd-finance/contracts/viem/index.ts deleted file mode 100644 index e08d4ad25..000000000 --- a/src/apps/unlockd-finance/contracts/viem/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ - -export type { UnlockdFinanceDebtToken } from './UnlockdFinanceDebtToken'; -export type { UnlockdFinanceLendPoolAddressesProvider } from './UnlockdFinanceLendPoolAddressesProvider'; -export type { UnlockdFinanceLendPool } from './UnlockdFinanceLendPool'; -export type { UnlockdFinanceProtocolDataProvider } from './UnlockdFinanceProtocolDataProvider'; -export type { UnlockdFinanceUToken } from './UnlockdFinanceUToken'; - -export { UnlockdFinanceDebtToken__factory } from './UnlockdFinanceDebtToken'; -export { UnlockdFinanceLendPoolAddressesProvider__factory } from './UnlockdFinanceLendPoolAddressesProvider'; -export { UnlockdFinanceLendPool__factory } from './UnlockdFinanceLendPool'; -export { UnlockdFinanceProtocolDataProvider__factory } from './UnlockdFinanceProtocolDataProvider'; -export { UnlockdFinanceUToken__factory } from './UnlockdFinanceUToken'; diff --git a/src/apps/unlockd-finance/ethereum/unlockd-finance.position-presenter.ts b/src/apps/unlockd-finance/ethereum/unlockd-finance.position-presenter.ts index aa387f311..0aca843af 100644 --- a/src/apps/unlockd-finance/ethereum/unlockd-finance.position-presenter.ts +++ b/src/apps/unlockd-finance/ethereum/unlockd-finance.position-presenter.ts @@ -18,7 +18,7 @@ export class EthereumUnlockdFinancePositionPresenter extends PositionPresenterTe { viewType: 'list', label: 'Borrow', - groupIds: ['variable-debt'], + groupIds: ['variable-debt-2'], }, ], }, diff --git a/src/apps/unlockd-finance/ethereum/unlockd-finance.supply.token-fetcher.ts b/src/apps/unlockd-finance/ethereum/unlockd-finance.supply.token-fetcher.ts deleted file mode 100644 index fad1d6b4a..000000000 --- a/src/apps/unlockd-finance/ethereum/unlockd-finance.supply.token-fetcher.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { getLabelFromToken } from '~app-toolkit/helpers/presentation/image.present'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetAddressesParams, - DefaultAppTokenDefinition, - GetUnderlyingTokensParams, - GetDataPropsParams, - GetDisplayPropsParams, -} from '~position/template/app-token.template.types'; - -import { UnlockdFinanceViemContractFactory } from '../contracts'; -import { UnlockdFinanceUToken } from '../contracts/viem'; - -const SECONDS_PER_YEAR = 31536000; - -@PositionTemplate() -export class EthereumUnlockdFinanceSupplyTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Lending'; - uTokenAddress = '0x302ceac15678e3238d19a0c4714533701169c217'; // Mainnet UToken Address - wethAddress = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'; // Mainnet WETH Address - dataProviderAddress = '0x4abde724f8d7cb5ec7b22a9b86824591be9fdc86'; // Mainnet Data Provider Address - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(UnlockdFinanceViemContractFactory) private readonly contractFactory: UnlockdFinanceViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.unlockdFinanceUToken({ network: this.network, address }); - } - - async getAddresses(_params: GetAddressesParams): Promise { - return [this.uTokenAddress]; - } - - async getUnderlyingTokenDefinitions({ contract }: GetUnderlyingTokensParams) { - return [{ address: await contract.read.UNDERLYING_ASSET_ADDRESS(), network: this.network }]; - } - - async getPricePerShare() { - return [1]; - } - - async getApy({ multicall }: GetDataPropsParams): Promise { - const pool = multicall.wrap( - this.contractFactory.unlockdFinanceProtocolDataProvider({ - network: this.network, - address: this.dataProviderAddress, - }), - ); - - const reservesData = await pool.read.getReserveData([this.wethAddress]); - - const aprNumber = Number(reservesData[2]) / 10 ** 27; - - const apyNumber = (aprNumber / SECONDS_PER_YEAR + 1) ** SECONDS_PER_YEAR - 1; - - return apyNumber * 100; - } - - async getLabel({ appToken }: GetDisplayPropsParams): Promise { - return getLabelFromToken(appToken.tokens[0]); - } - - async getLabelDetailed({ appToken }: GetDisplayPropsParams): Promise { - return appToken.symbol; - } - - async getTertiaryLabel({ appToken }: GetDisplayPropsParams) { - return `${appToken.dataProps.apy.toFixed(3)}% APY`; - } -} diff --git a/src/apps/unlockd-finance/ethereum/unlockd-finance.variable-debt.token-fetcher.ts b/src/apps/unlockd-finance/ethereum/unlockd-finance.variable-debt.token-fetcher.ts deleted file mode 100644 index 9c15c1d99..000000000 --- a/src/apps/unlockd-finance/ethereum/unlockd-finance.variable-debt.token-fetcher.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; -import { getLabelFromToken } from '~app-toolkit/helpers/presentation/image.present'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { - GetAddressesParams, - DefaultAppTokenDefinition, - GetUnderlyingTokensParams, - UnderlyingTokenDefinition, - GetDataPropsParams, - GetDisplayPropsParams, -} from '~position/template/app-token.template.types'; - -import { UnlockdFinanceViemContractFactory } from '../contracts'; -import { UnlockdFinanceUToken } from '../contracts/viem'; - -const SECONDS_PER_YEAR = 31536000; - -@PositionTemplate() -export class EthereumUnlockdFinanceVariableDebtTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'Lending'; - debtTokenAddress = '0xd11cf5512a775591b3258d976af51d3a70a6660e'; // Mainnet DebtToken Address - wethAddress = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'; // Mainnet WETH Address - dataProviderAddress = '0x4abde724f8d7cb5ec7b22a9b86824591be9fdc86'; // Mainnet Data Provider Address - isDebt = true; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(UnlockdFinanceViemContractFactory) private readonly contractFactory: UnlockdFinanceViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.contractFactory.unlockdFinanceUToken({ network: this.network, address }); - } - - async getAddresses(_params: GetAddressesParams): Promise { - return [this.debtTokenAddress]; - } - - async getUnderlyingTokenDefinitions({ - contract, - }: GetUnderlyingTokensParams): Promise { - return [{ address: await contract.read.UNDERLYING_ASSET_ADDRESS(), network: this.network }]; - } - - async getPricePerShare() { - return [1]; - } - - async getApy({ multicall }: GetDataPropsParams): Promise { - const pool = multicall.wrap( - this.contractFactory.unlockdFinanceProtocolDataProvider({ - network: this.network, - address: this.dataProviderAddress, - }), - ); - - const reservesData = await pool.read.getReserveData([this.wethAddress]); - - const apr = Number(reservesData[3]) / 10 ** 27; - - const base = apr / SECONDS_PER_YEAR + 1; - - const apy = base ** SECONDS_PER_YEAR - 1; - - return apy * 100; - } - - async getLabel({ appToken }: GetDisplayPropsParams): Promise { - return getLabelFromToken(appToken.tokens[0]); - } - - async getLabelDetailed({ appToken }: GetDisplayPropsParams): Promise { - return appToken.symbol; - } - - async getTertiaryLabel({ appToken }: GetDisplayPropsParams) { - return `${appToken.dataProps.apy.toFixed(3)}% APY (variable)`; - } -} diff --git a/src/apps/unlockd-finance/unlockd-finance.module.ts b/src/apps/unlockd-finance/unlockd-finance.module.ts index 8cea49b96..4450b7cd7 100644 --- a/src/apps/unlockd-finance/unlockd-finance.module.ts +++ b/src/apps/unlockd-finance/unlockd-finance.module.ts @@ -2,17 +2,9 @@ import { Module } from '@nestjs/common'; import { AbstractApp } from '~app/app.dynamic-module'; -import { UnlockdFinanceViemContractFactory } from './contracts'; import { EthereumUnlockdFinancePositionPresenter } from './ethereum/unlockd-finance.position-presenter'; -import { EthereumUnlockdFinanceSupplyTokenFetcher } from './ethereum/unlockd-finance.supply.token-fetcher'; -import { EthereumUnlockdFinanceVariableDebtTokenFetcher } from './ethereum/unlockd-finance.variable-debt.token-fetcher'; @Module({ - providers: [ - UnlockdFinanceViemContractFactory, - EthereumUnlockdFinancePositionPresenter, - EthereumUnlockdFinanceSupplyTokenFetcher, - EthereumUnlockdFinanceVariableDebtTokenFetcher, - ], + providers: [EthereumUnlockdFinancePositionPresenter], }) export class UnlockdFinanceAppModule extends AbstractApp() {} diff --git a/src/apps/vela/arbitrum/vela.es-vela.token-fetcher.ts b/src/apps/vela/arbitrum/vela.es-vela.token-fetcher.ts deleted file mode 100644 index ec4b3e570..000000000 --- a/src/apps/vela/arbitrum/vela.es-vela.token-fetcher.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { PositionTemplate } from '~app-toolkit/decorators/position-template.decorator'; - -import { VelaEsVelaTokenFetcher } from '../common/vela.es-vela.token-fetcher'; - -@PositionTemplate() -export class ArbitrumVelaEsVelaTokenFetcher extends VelaEsVelaTokenFetcher { - esVelaAddress = '0xefd5a713c5bd85e9ced46070b2532e4a47a18102'; - velaAddress = '0x088cd8f5ef3652623c22d48b1605dcfe860cd704'; -} diff --git a/src/apps/vela/common/vela.es-vela.token-fetcher.ts b/src/apps/vela/common/vela.es-vela.token-fetcher.ts deleted file mode 100644 index 6bf673b6e..000000000 --- a/src/apps/vela/common/vela.es-vela.token-fetcher.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Inject } from '@nestjs/common'; - -import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; -import { Erc20 } from '~contract/contracts/viem'; -import { AppTokenTemplatePositionFetcher } from '~position/template/app-token.template.position-fetcher'; -import { UnderlyingTokenDefinition } from '~position/template/app-token.template.types'; - -import { VelaViemContractFactory } from '../contracts'; - -export abstract class VelaEsVelaTokenFetcher extends AppTokenTemplatePositionFetcher { - groupLabel = 'esVELA'; - - abstract esVelaAddress: string; - abstract velaAddress: string; - - constructor( - @Inject(APP_TOOLKIT) protected readonly appToolkit: IAppToolkit, - @Inject(VelaViemContractFactory) private readonly velaContractFactory: VelaViemContractFactory, - ) { - super(appToolkit); - } - - getContract(address: string) { - return this.appToolkit.globalViemContracts.erc20({ - address, - network: this.network, - }); - } - - async getAddresses(): Promise { - return [this.esVelaAddress]; - } - - async getUnderlyingTokenDefinitions(): Promise { - return [{ address: this.velaAddress, network: this.network }]; - } - - async getPricePerShare(): Promise { - return [1]; - } -} diff --git a/src/apps/vela/vela.module.ts b/src/apps/vela/vela.module.ts index 7d2f4af66..d9a411d85 100644 --- a/src/apps/vela/vela.module.ts +++ b/src/apps/vela/vela.module.ts @@ -2,17 +2,11 @@ import { Module } from '@nestjs/common'; import { AbstractApp } from '~app/app.dynamic-module'; -import { ArbitrumVelaEsVelaTokenFetcher } from './arbitrum/vela.es-vela.token-fetcher'; import { ArbitrumVelaVlpFarmContractPositionFetcher } from './arbitrum/vela.token-farm.contract-position-fetcher'; import { ArbitrumVelaVlpTokenFetcher } from './arbitrum/vela.vlp.token-fetcher'; import { VelaViemContractFactory } from './contracts'; @Module({ - providers: [ - ArbitrumVelaEsVelaTokenFetcher, - ArbitrumVelaVlpFarmContractPositionFetcher, - ArbitrumVelaVlpTokenFetcher, - VelaViemContractFactory, - ], + providers: [ArbitrumVelaVlpFarmContractPositionFetcher, ArbitrumVelaVlpTokenFetcher, VelaViemContractFactory], }) export class VelaAppModule extends AbstractApp() {}