@andrewkimjoseph/celina-sdk 0.9.7 → 0.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/analytics/mcp-tool-events.js +2 -0
- package/build/analytics/mcp-tool-events.js.map +1 -1
- package/build/index.d.ts +1 -1
- package/build/services/gooddollar.service.d.ts +16 -2
- package/build/services/gooddollar.service.js +54 -31
- package/build/services/gooddollar.service.js.map +1 -1
- package/build/src/a2a/agent-card.d.ts +37 -0
- package/build/src/a2a/agent-card.js +46 -0
- package/build/src/a2a/agent-card.js.map +1 -0
- package/build/src/a2a/index.d.ts +2 -0
- package/build/src/a2a/index.js +3 -0
- package/build/src/a2a/index.js.map +1 -0
- package/build/src/a2a/skills.d.ts +18 -0
- package/build/src/a2a/skills.js +101 -0
- package/build/src/a2a/skills.js.map +1 -0
- package/build/src/abis/aave-pool.d.ts +37 -0
- package/build/src/abis/aave-pool.js +26 -0
- package/build/src/abis/aave-pool.js.map +1 -0
- package/build/src/abis/accounts.d.ts +13 -0
- package/build/src/abis/accounts.js +10 -0
- package/build/src/abis/accounts.js.map +1 -0
- package/build/src/abis/election.d.ts +124 -0
- package/build/src/abis/election.js +88 -0
- package/build/src/abis/election.js.map +1 -0
- package/build/src/abis/gooddollar-broker.d.ts +77 -0
- package/build/src/abis/gooddollar-broker.js +44 -0
- package/build/src/abis/gooddollar-broker.js.map +1 -0
- package/build/src/abis/gooddollar-identity.d.ts +85 -0
- package/build/src/abis/gooddollar-identity.js +52 -0
- package/build/src/abis/gooddollar-identity.js.map +1 -0
- package/build/src/abis/governance.d.ts +86 -0
- package/build/src/abis/governance.js +68 -0
- package/build/src/abis/governance.js.map +1 -0
- package/build/src/abis/locked-gold.d.ts +10 -0
- package/build/src/abis/locked-gold.js +10 -0
- package/build/src/abis/locked-gold.js.map +1 -0
- package/build/src/abis/nft.d.ts +107 -0
- package/build/src/abis/nft.js +75 -0
- package/build/src/abis/nft.js.map +1 -0
- package/build/src/abis/permit2.d.ts +43 -0
- package/build/src/abis/permit2.js +30 -0
- package/build/src/abis/permit2.js.map +1 -0
- package/build/src/abis/self-registry.d.ts +194 -0
- package/build/src/abis/self-registry.js +120 -0
- package/build/src/abis/self-registry.js.map +1 -0
- package/build/src/abis/ubi-scheme.d.ts +91 -0
- package/build/src/abis/ubi-scheme.js +66 -0
- package/build/src/abis/ubi-scheme.js.map +1 -0
- package/build/src/abis/uniswap-state-view.d.ts +34 -0
- package/build/src/abis/uniswap-state-view.js +22 -0
- package/build/src/abis/uniswap-state-view.js.map +1 -0
- package/build/src/abis/uniswap-v4-quoter.d.ts +86 -0
- package/build/src/abis/uniswap-v4-quoter.js +64 -0
- package/build/src/abis/uniswap-v4-quoter.js.map +1 -0
- package/build/src/abis/universal-router.d.ts +16 -0
- package/build/src/abis/universal-router.js +14 -0
- package/build/src/abis/universal-router.js.map +1 -0
- package/build/src/abis/validators-minimal.d.ts +65 -0
- package/build/src/abis/validators-minimal.js +39 -0
- package/build/src/abis/validators-minimal.js.map +1 -0
- package/build/src/analytics/amplitude.d.ts +11 -0
- package/build/src/analytics/amplitude.js +76 -0
- package/build/src/analytics/amplitude.js.map +1 -0
- package/build/src/analytics/config.d.ts +7 -0
- package/build/src/analytics/config.js +28 -0
- package/build/src/analytics/config.js.map +1 -0
- package/build/src/analytics/consumer-package.d.ts +9 -0
- package/build/src/analytics/consumer-package.js +143 -0
- package/build/src/analytics/consumer-package.js.map +1 -0
- package/build/src/analytics/mcp-tool-events.d.ts +5 -0
- package/build/src/analytics/mcp-tool-events.js +53 -0
- package/build/src/analytics/mcp-tool-events.js.map +1 -0
- package/build/src/analytics/wallet-context.d.ts +11 -0
- package/build/src/analytics/wallet-context.js +81 -0
- package/build/src/analytics/wallet-context.js.map +1 -0
- package/build/src/analytics/wallet-extract.d.ts +9 -0
- package/build/src/analytics/wallet-extract.js +21 -0
- package/build/src/analytics/wallet-extract.js.map +1 -0
- package/build/src/analytics/wrap-service.d.ts +5 -0
- package/build/src/analytics/wrap-service.js +38 -0
- package/build/src/analytics/wrap-service.js.map +1 -0
- package/build/src/clients/celo-client.d.ts +17 -0
- package/build/src/clients/celo-client.js +28 -0
- package/build/src/clients/celo-client.js.map +1 -0
- package/build/src/clients/ens-client.d.ts +17 -0
- package/build/src/clients/ens-client.js +30 -0
- package/build/src/clients/ens-client.js.map +1 -0
- package/build/src/clients/mento-sdk.d.ts +2 -0
- package/build/src/clients/mento-sdk.js +9 -0
- package/build/src/clients/mento-sdk.js.map +1 -0
- package/build/src/clients/self-api.d.ts +82 -0
- package/build/src/clients/self-api.js +242 -0
- package/build/src/clients/self-api.js.map +1 -0
- package/build/src/clients/uniswap-sdk.d.ts +4 -0
- package/build/src/clients/uniswap-sdk.js +13 -0
- package/build/src/clients/uniswap-sdk.js.map +1 -0
- package/build/src/config/aave.d.ts +17 -0
- package/build/src/config/aave.js +77 -0
- package/build/src/config/aave.js.map +1 -0
- package/build/src/config/celina-tag.d.ts +4 -0
- package/build/src/config/celina-tag.js +13 -0
- package/build/src/config/celina-tag.js.map +1 -0
- package/build/src/config/celo-core-contracts.d.ts +8 -0
- package/build/src/config/celo-core-contracts.js +9 -0
- package/build/src/config/celo-core-contracts.js.map +1 -0
- package/build/src/config/chains.d.ts +937 -0
- package/build/src/config/chains.js +319 -0
- package/build/src/config/chains.js.map +1 -0
- package/build/src/config/gooddollar.d.ts +16 -0
- package/build/src/config/gooddollar.js +24 -0
- package/build/src/config/gooddollar.js.map +1 -0
- package/build/src/config/sdk-config.d.ts +33 -0
- package/build/src/config/sdk-config.js +31 -0
- package/build/src/config/sdk-config.js.map +1 -0
- package/build/src/config/self.d.ts +22 -0
- package/build/src/config/self.js +27 -0
- package/build/src/config/self.js.map +1 -0
- package/build/src/config/uniswap.d.ts +42 -0
- package/build/src/config/uniswap.js +76 -0
- package/build/src/config/uniswap.js.map +1 -0
- package/build/src/index.d.ts +90 -0
- package/build/src/index.js +65 -0
- package/build/src/index.js.map +1 -0
- package/build/src/oasf/index.d.ts +2 -0
- package/build/src/oasf/index.js +3 -0
- package/build/src/oasf/index.js.map +1 -0
- package/build/src/oasf/record.d.ts +39 -0
- package/build/src/oasf/record.js +35 -0
- package/build/src/oasf/record.js.map +1 -0
- package/build/src/oasf/taxonomy.d.ts +19 -0
- package/build/src/oasf/taxonomy.js +46 -0
- package/build/src/oasf/taxonomy.js.map +1 -0
- package/build/src/services/aave.service.d.ts +58 -0
- package/build/src/services/aave.service.js +210 -0
- package/build/src/services/aave.service.js.map +1 -0
- package/build/src/services/account.service.d.ts +22 -0
- package/build/src/services/account.service.js +29 -0
- package/build/src/services/account.service.js.map +1 -0
- package/build/src/services/blockchain.service.d.ts +107 -0
- package/build/src/services/blockchain.service.js +151 -0
- package/build/src/services/blockchain.service.js.map +1 -0
- package/build/src/services/contract.service.d.ts +78 -0
- package/build/src/services/contract.service.js +117 -0
- package/build/src/services/contract.service.js.map +1 -0
- package/build/src/services/ens.service.d.ts +44 -0
- package/build/src/services/ens.service.js +92 -0
- package/build/src/services/ens.service.js.map +1 -0
- package/build/src/services/gooddollar.service.d.ts +183 -0
- package/build/src/services/gooddollar.service.js +675 -0
- package/build/src/services/gooddollar.service.js.map +1 -0
- package/build/src/services/governance.service.d.ts +96 -0
- package/build/src/services/governance.service.js +255 -0
- package/build/src/services/governance.service.js.map +1 -0
- package/build/src/services/mento-fx.service.d.ts +80 -0
- package/build/src/services/mento-fx.service.js +319 -0
- package/build/src/services/mento-fx.service.js.map +1 -0
- package/build/src/services/nft.service.d.ts +58 -0
- package/build/src/services/nft.service.js +222 -0
- package/build/src/services/nft.service.js.map +1 -0
- package/build/src/services/self-session-store.d.ts +19 -0
- package/build/src/services/self-session-store.js +28 -0
- package/build/src/services/self-session-store.js.map +1 -0
- package/build/src/services/self.service.d.ts +241 -0
- package/build/src/services/self.service.js +699 -0
- package/build/src/services/self.service.js.map +1 -0
- package/build/src/services/staking.service.d.ts +140 -0
- package/build/src/services/staking.service.js +444 -0
- package/build/src/services/staking.service.js.map +1 -0
- package/build/src/services/token.service.d.ts +110 -0
- package/build/src/services/token.service.js +189 -0
- package/build/src/services/token.service.js.map +1 -0
- package/build/src/services/transaction.service.d.ts +68 -0
- package/build/src/services/transaction.service.js +198 -0
- package/build/src/services/transaction.service.js.map +1 -0
- package/build/src/services/uniswap-path-router.d.ts +40 -0
- package/build/src/services/uniswap-path-router.js +168 -0
- package/build/src/services/uniswap-path-router.js.map +1 -0
- package/build/src/services/uniswap-pool-discovery.d.ts +55 -0
- package/build/src/services/uniswap-pool-discovery.js +198 -0
- package/build/src/services/uniswap-pool-discovery.js.map +1 -0
- package/build/src/services/uniswap.service.d.ts +82 -0
- package/build/src/services/uniswap.service.js +352 -0
- package/build/src/services/uniswap.service.js.map +1 -0
- package/build/src/simulation/index.d.ts +5 -0
- package/build/src/simulation/index.js +2 -0
- package/build/src/simulation/index.js.map +1 -0
- package/build/src/simulation/simulate-prepared-step.d.ts +17 -0
- package/build/src/simulation/simulate-prepared-step.js +42 -0
- package/build/src/simulation/simulate-prepared-step.js.map +1 -0
- package/build/src/tools/catalog.d.ts +11 -0
- package/build/src/tools/catalog.js +43 -0
- package/build/src/tools/catalog.js.map +1 -0
- package/build/src/tools/domains/aave.d.ts +2 -0
- package/build/src/tools/domains/aave.js +115 -0
- package/build/src/tools/domains/aave.js.map +1 -0
- package/build/src/tools/domains/blockchain.d.ts +2 -0
- package/build/src/tools/domains/blockchain.js +86 -0
- package/build/src/tools/domains/blockchain.js.map +1 -0
- package/build/src/tools/domains/browser.d.ts +2 -0
- package/build/src/tools/domains/browser.js +45 -0
- package/build/src/tools/domains/browser.js.map +1 -0
- package/build/src/tools/domains/contract.d.ts +2 -0
- package/build/src/tools/domains/contract.js +67 -0
- package/build/src/tools/domains/contract.js.map +1 -0
- package/build/src/tools/domains/ens.d.ts +2 -0
- package/build/src/tools/domains/ens.js +16 -0
- package/build/src/tools/domains/ens.js.map +1 -0
- package/build/src/tools/domains/gooddollar.d.ts +2 -0
- package/build/src/tools/domains/gooddollar.js +171 -0
- package/build/src/tools/domains/gooddollar.js.map +1 -0
- package/build/src/tools/domains/governance.d.ts +2 -0
- package/build/src/tools/domains/governance.js +41 -0
- package/build/src/tools/domains/governance.js.map +1 -0
- package/build/src/tools/domains/index.d.ts +1 -0
- package/build/src/tools/domains/index.js +31 -0
- package/build/src/tools/domains/index.js.map +1 -0
- package/build/src/tools/domains/mento-fx.d.ts +2 -0
- package/build/src/tools/domains/mento-fx.js +67 -0
- package/build/src/tools/domains/mento-fx.js.map +1 -0
- package/build/src/tools/domains/nft.d.ts +2 -0
- package/build/src/tools/domains/nft.js +38 -0
- package/build/src/tools/domains/nft.js.map +1 -0
- package/build/src/tools/domains/self.d.ts +2 -0
- package/build/src/tools/domains/self.js +187 -0
- package/build/src/tools/domains/self.js.map +1 -0
- package/build/src/tools/domains/staking.d.ts +2 -0
- package/build/src/tools/domains/staking.js +74 -0
- package/build/src/tools/domains/staking.js.map +1 -0
- package/build/src/tools/domains/token.d.ts +2 -0
- package/build/src/tools/domains/token.js +74 -0
- package/build/src/tools/domains/token.js.map +1 -0
- package/build/src/tools/domains/transaction.d.ts +2 -0
- package/build/src/tools/domains/transaction.js +120 -0
- package/build/src/tools/domains/transaction.js.map +1 -0
- package/build/src/tools/domains/uniswap.d.ts +2 -0
- package/build/src/tools/domains/uniswap.js +67 -0
- package/build/src/tools/domains/uniswap.js.map +1 -0
- package/build/src/tools/filter.d.ts +2 -0
- package/build/src/tools/filter.js +50 -0
- package/build/src/tools/filter.js.map +1 -0
- package/build/src/tools/index.d.ts +7 -0
- package/build/src/tools/index.js +7 -0
- package/build/src/tools/index.js.map +1 -0
- package/build/src/tools/schemas/common.d.ts +165 -0
- package/build/src/tools/schemas/common.js +207 -0
- package/build/src/tools/schemas/common.js.map +1 -0
- package/build/src/tools/schemas/wallet-params.d.ts +9 -0
- package/build/src/tools/schemas/wallet-params.js +52 -0
- package/build/src/tools/schemas/wallet-params.js.map +1 -0
- package/build/src/tools/swap-routing.d.ts +25 -0
- package/build/src/tools/swap-routing.js +174 -0
- package/build/src/tools/swap-routing.js.map +1 -0
- package/build/src/tools/types.d.ts +124 -0
- package/build/src/tools/types.js +2 -0
- package/build/src/tools/types.js.map +1 -0
- package/build/src/tools/utils/normalize-token.d.ts +2 -0
- package/build/src/tools/utils/normalize-token.js +12 -0
- package/build/src/tools/utils/normalize-token.js.map +1 -0
- package/build/src/tools/utils/wallet.d.ts +4 -0
- package/build/src/tools/utils/wallet.js +8 -0
- package/build/src/tools/utils/wallet.js.map +1 -0
- package/build/src/tools/website-sync.d.ts +28 -0
- package/build/src/tools/website-sync.js +165 -0
- package/build/src/tools/website-sync.js.map +1 -0
- package/build/src/types/prepared.d.ts +28 -0
- package/build/src/types/prepared.js +12 -0
- package/build/src/types/prepared.js.map +1 -0
- package/build/src/utils/celo-format.d.ts +6 -0
- package/build/src/utils/celo-format.js +17 -0
- package/build/src/utils/celo-format.js.map +1 -0
- package/build/src/utils/erc20-allowance-storage.d.ts +20 -0
- package/build/src/utils/erc20-allowance-storage.js +64 -0
- package/build/src/utils/erc20-allowance-storage.js.map +1 -0
- package/build/src/utils/format-date.d.ts +2 -0
- package/build/src/utils/format-date.js +13 -0
- package/build/src/utils/format-date.js.map +1 -0
- package/build/src/utils/format-duration.d.ts +2 -0
- package/build/src/utils/format-duration.js +17 -0
- package/build/src/utils/format-duration.js.map +1 -0
- package/build/src/utils/format-unix-datetime.d.ts +4 -0
- package/build/src/utils/format-unix-datetime.js +18 -0
- package/build/src/utils/format-unix-datetime.js.map +1 -0
- package/build/src/utils/gooddollar-ubi-period.d.ts +23 -0
- package/build/src/utils/gooddollar-ubi-period.js +23 -0
- package/build/src/utils/gooddollar-ubi-period.js.map +1 -0
- package/build/src/utils/normalize-address.d.ts +7 -0
- package/build/src/utils/normalize-address.js +16 -0
- package/build/src/utils/normalize-address.js.map +1 -0
- package/build/src/utils/self-format.d.ts +28 -0
- package/build/src/utils/self-format.js +79 -0
- package/build/src/utils/self-format.js.map +1 -0
- package/build/src/utils/self-signing.d.ts +4 -0
- package/build/src/utils/self-signing.js +38 -0
- package/build/src/utils/self-signing.js.map +1 -0
- package/build/src/utils/transaction-errors.d.ts +3 -0
- package/build/src/utils/transaction-errors.js +17 -0
- package/build/src/utils/transaction-errors.js.map +1 -0
- package/build/tests/catalog/domains/blockchain.d.ts +2 -0
- package/build/tests/catalog/domains/blockchain.js +127 -0
- package/build/tests/catalog/domains/blockchain.js.map +1 -0
- package/build/tests/catalog/domains/chain-ext.d.ts +5 -0
- package/build/tests/catalog/domains/chain-ext.js +207 -0
- package/build/tests/catalog/domains/chain-ext.js.map +1 -0
- package/build/tests/catalog/domains/defi.d.ts +6 -0
- package/build/tests/catalog/domains/defi.js +581 -0
- package/build/tests/catalog/domains/defi.js.map +1 -0
- package/build/tests/catalog/domains/self.d.ts +2 -0
- package/build/tests/catalog/domains/self.js +208 -0
- package/build/tests/catalog/domains/self.js.map +1 -0
- package/build/tests/catalog/domains/token.d.ts +2 -0
- package/build/tests/catalog/domains/token.js +70 -0
- package/build/tests/catalog/domains/token.js.map +1 -0
- package/build/tests/catalog/domains/transaction.d.ts +2 -0
- package/build/tests/catalog/domains/transaction.js +96 -0
- package/build/tests/catalog/domains/transaction.js.map +1 -0
- package/build/tests/catalog/index.d.ts +2 -0
- package/build/tests/catalog/index.js +2 -0
- package/build/tests/catalog/index.js.map +1 -0
- package/build/tests/catalog/operations.d.ts +12 -0
- package/build/tests/catalog/operations.js +29 -0
- package/build/tests/catalog/operations.js.map +1 -0
- package/build/tests/catalog/types.d.ts +24 -0
- package/build/tests/catalog/types.js +2 -0
- package/build/tests/catalog/types.js.map +1 -0
- package/build/tests/fixtures/mainnet.d.ts +54 -0
- package/build/tests/fixtures/mainnet.js +53 -0
- package/build/tests/fixtures/mainnet.js.map +1 -0
- package/build/tests/helpers/assert.d.ts +4 -0
- package/build/tests/helpers/assert.js +24 -0
- package/build/tests/helpers/assert.js.map +1 -0
- package/build/tests/helpers/env.d.ts +11 -0
- package/build/tests/helpers/env.js +28 -0
- package/build/tests/helpers/env.js.map +1 -0
- package/build/tests/helpers/gating.d.ts +3 -0
- package/build/tests/helpers/gating.js +23 -0
- package/build/tests/helpers/gating.js.map +1 -0
- package/build/tests/testing-entry.d.ts +6 -0
- package/build/tests/testing-entry.js +6 -0
- package/build/tests/testing-entry.js.map +1 -0
- package/build/tools/domains/browser.js +4 -1
- package/build/tools/domains/browser.js.map +1 -1
- package/build/tools/domains/gooddollar.js +11 -7
- package/build/tools/domains/gooddollar.js.map +1 -1
- package/build/tools/schemas/common.d.ts +7 -0
- package/build/tools/schemas/common.js +9 -1
- package/build/tools/schemas/common.js.map +1 -1
- package/build/tools/swap-routing.d.ts +1 -0
- package/build/tools/swap-routing.js +2 -1
- package/build/tools/swap-routing.js.map +1 -1
- package/package.json +5 -9
- package/tests/README.md +0 -78
- package/tests/catalog/domains/blockchain.ts +0 -133
- package/tests/catalog/domains/chain-ext.ts +0 -219
- package/tests/catalog/domains/defi.ts +0 -532
- package/tests/catalog/domains/self.ts +0 -220
- package/tests/catalog/domains/token.ts +0 -74
- package/tests/catalog/domains/transaction.ts +0 -111
- package/tests/catalog/index.ts +0 -7
- package/tests/catalog/operations.ts +0 -53
- package/tests/catalog/types.ts +0 -27
- package/tests/fixtures/mainnet.ts +0 -93
- package/tests/helpers/assert.ts +0 -30
- package/tests/helpers/env.ts +0 -38
- package/tests/helpers/gating.ts +0 -36
- package/tests/testing-entry.ts +0 -27
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** CELO mainnet account snapshot for a wallet or contract address. */
|
|
2
|
+
export class AccountService {
|
|
3
|
+
clientFactory;
|
|
4
|
+
constructor(clientFactory) {
|
|
5
|
+
this.clientFactory = clientFactory;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Fetch CELO balance, nonce, and whether the address has contract bytecode.
|
|
9
|
+
* @param address - Wallet or contract address on Celo mainnet
|
|
10
|
+
* @returns Balance in wei and CELO, current nonce, and `isContract` flag
|
|
11
|
+
*/
|
|
12
|
+
async getAccount(address) {
|
|
13
|
+
const { public: client } = this.clientFactory.getClients();
|
|
14
|
+
const [balance, nonce, bytecode] = await Promise.all([
|
|
15
|
+
client.getBalance({ address }),
|
|
16
|
+
client.getTransactionCount({ address }),
|
|
17
|
+
client.getCode({ address }),
|
|
18
|
+
]);
|
|
19
|
+
return {
|
|
20
|
+
address,
|
|
21
|
+
network: "mainnet",
|
|
22
|
+
balanceWei: balance.toString(),
|
|
23
|
+
balanceCelo: Number(balance) / 1e18,
|
|
24
|
+
nonce,
|
|
25
|
+
isContract: bytecode !== undefined && bytecode !== "0x",
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=account.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.service.js","sourceRoot":"","sources":["../../../src/services/account.service.ts"],"names":[],"mappings":"AAKA,sEAAsE;AACtE,MAAM,OAAO,cAAc;IACI;IAA7B,YAA6B,aAAgC;QAAhC,kBAAa,GAAb,aAAa,CAAmB;IAAG,CAAC;IAEjE;;;;OAIG;IACH,KAAK,CAAC,UAAU,CAAC,OAAsB;QACrC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAC3D,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACnD,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;YAC9B,MAAM,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,CAAC;YACvC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;SAC5B,CAAC,CAAC;QAEH,OAAO;YACL,OAAO;YACP,OAAO,EAAE,SAAS;YAClB,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE;YAC9B,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI;YACnC,KAAK;YACL,UAAU,EAAE,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;SACxD,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain reads: network status, blocks, and transaction lookups on Celo mainnet.
|
|
3
|
+
*/
|
|
4
|
+
import type { CeloClientFactory } from "../clients/celo-client.js";
|
|
5
|
+
/** Celo mainnet block and transaction queries. */
|
|
6
|
+
export declare class BlockchainService {
|
|
7
|
+
private readonly clientFactory;
|
|
8
|
+
constructor(clientFactory: CeloClientFactory);
|
|
9
|
+
/**
|
|
10
|
+
* Celo mainnet chain id, latest block number, and current gas price.
|
|
11
|
+
* @returns Network metadata including `chainId`, `blockNumber`, and `gasPriceWei`
|
|
12
|
+
*/
|
|
13
|
+
getNetworkStatus(): Promise<{
|
|
14
|
+
network: string;
|
|
15
|
+
chainId: number;
|
|
16
|
+
blockNumber: string;
|
|
17
|
+
gasPriceWei: string;
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* Fetch a block by number, hash, or tag.
|
|
21
|
+
* @param blockId - Block number, hash, `latest`, or `pending`
|
|
22
|
+
* @param options.includeTransactions - When true, include full transaction objects
|
|
23
|
+
* @returns Block header fields and optional transaction list
|
|
24
|
+
* @throws When the block is not found
|
|
25
|
+
*/
|
|
26
|
+
getBlock(blockId: number | string | "latest" | "pending", options?: {
|
|
27
|
+
includeTransactions?: boolean;
|
|
28
|
+
}): Promise<{
|
|
29
|
+
number: string | undefined;
|
|
30
|
+
hash: `0x${string}` | null;
|
|
31
|
+
timestamp: string;
|
|
32
|
+
parentHash: `0x${string}`;
|
|
33
|
+
gasUsed: string;
|
|
34
|
+
gasLimit: string;
|
|
35
|
+
gasUtilization: number;
|
|
36
|
+
miner: `0x${string}`;
|
|
37
|
+
transactionCount: number;
|
|
38
|
+
transactions: (`0x${string}` | {
|
|
39
|
+
hash: `0x${string}`;
|
|
40
|
+
from: `0x${string}`;
|
|
41
|
+
to: `0x${string}` | null;
|
|
42
|
+
value: string;
|
|
43
|
+
valueCelo: number;
|
|
44
|
+
nonce: number;
|
|
45
|
+
gas: string;
|
|
46
|
+
gasPrice: string | undefined;
|
|
47
|
+
gasPriceGwei: number | undefined;
|
|
48
|
+
input: `0x${string}`;
|
|
49
|
+
blockNumber: string | undefined;
|
|
50
|
+
transactionIndex: number | null | undefined;
|
|
51
|
+
type: string | undefined;
|
|
52
|
+
})[] | undefined;
|
|
53
|
+
}>;
|
|
54
|
+
/**
|
|
55
|
+
* List recent blocks ending at the chain tip (newest last in the array).
|
|
56
|
+
* @param count - Number of blocks to return (1–100, default 5)
|
|
57
|
+
* @param offset - Skip this many blocks from the tip before collecting
|
|
58
|
+
* @returns Summary fields per block (no full transaction payloads)
|
|
59
|
+
*/
|
|
60
|
+
getLatestBlocks(count?: number, offset?: number): Promise<{
|
|
61
|
+
number: string;
|
|
62
|
+
hash: `0x${string}`;
|
|
63
|
+
timestamp: string;
|
|
64
|
+
transactionCount: number;
|
|
65
|
+
gasUsed: string;
|
|
66
|
+
gasLimit: string;
|
|
67
|
+
gasUtilization: number;
|
|
68
|
+
}[]>;
|
|
69
|
+
/**
|
|
70
|
+
* Fetch a transaction and its receipt by hash.
|
|
71
|
+
* @param hash - Transaction hash
|
|
72
|
+
* @returns Transaction fields, gas efficiency, and receipt status when mined
|
|
73
|
+
* @throws When the transaction is not found
|
|
74
|
+
*/
|
|
75
|
+
getTransaction(hash: `0x${string}`): Promise<{
|
|
76
|
+
hash: `0x${string}`;
|
|
77
|
+
from: `0x${string}`;
|
|
78
|
+
to: `0x${string}` | null;
|
|
79
|
+
value: string;
|
|
80
|
+
valueCelo: number;
|
|
81
|
+
nonce: number;
|
|
82
|
+
gas: string;
|
|
83
|
+
gasPrice: string | undefined;
|
|
84
|
+
gasPriceGwei: number | undefined;
|
|
85
|
+
input: `0x${string}`;
|
|
86
|
+
blockNumber: string | undefined;
|
|
87
|
+
transactionIndex: number | null | undefined;
|
|
88
|
+
type: string | undefined;
|
|
89
|
+
} | {
|
|
90
|
+
status?: string | undefined;
|
|
91
|
+
gasUsed: string;
|
|
92
|
+
gasEfficiency: number;
|
|
93
|
+
hash: `0x${string}`;
|
|
94
|
+
from: `0x${string}`;
|
|
95
|
+
to: `0x${string}` | null;
|
|
96
|
+
value: string;
|
|
97
|
+
valueCelo: number;
|
|
98
|
+
nonce: number;
|
|
99
|
+
gas: string;
|
|
100
|
+
gasPrice: string | undefined;
|
|
101
|
+
gasPriceGwei: number | undefined;
|
|
102
|
+
input: `0x${string}`;
|
|
103
|
+
blockNumber: string | undefined;
|
|
104
|
+
transactionIndex: number | null | undefined;
|
|
105
|
+
type: string | undefined;
|
|
106
|
+
}>;
|
|
107
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
function serializeTransactionSummary(tx, extras) {
|
|
2
|
+
const base = {
|
|
3
|
+
hash: tx.hash,
|
|
4
|
+
from: tx.from,
|
|
5
|
+
to: tx.to,
|
|
6
|
+
value: tx.value.toString(),
|
|
7
|
+
valueCelo: Number(tx.value) / 1e18,
|
|
8
|
+
nonce: tx.nonce,
|
|
9
|
+
gas: tx.gas.toString(),
|
|
10
|
+
gasPrice: tx.gasPrice?.toString(),
|
|
11
|
+
gasPriceGwei: tx.gasPrice ? Number(tx.gasPrice) / 1e9 : undefined,
|
|
12
|
+
input: tx.input,
|
|
13
|
+
blockNumber: tx.blockNumber?.toString(),
|
|
14
|
+
transactionIndex: tx.transactionIndex,
|
|
15
|
+
type: tx.type,
|
|
16
|
+
};
|
|
17
|
+
if (!extras) {
|
|
18
|
+
return base;
|
|
19
|
+
}
|
|
20
|
+
const gasEfficiency = tx.gas > 0n
|
|
21
|
+
? Number((extras.gasUsed * 10000n) / tx.gas) / 100
|
|
22
|
+
: 0;
|
|
23
|
+
return {
|
|
24
|
+
...base,
|
|
25
|
+
gasUsed: extras.gasUsed.toString(),
|
|
26
|
+
gasEfficiency,
|
|
27
|
+
...(extras.status !== undefined ? { status: extras.status } : {}),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** Celo mainnet block and transaction queries. */
|
|
31
|
+
export class BlockchainService {
|
|
32
|
+
clientFactory;
|
|
33
|
+
constructor(clientFactory) {
|
|
34
|
+
this.clientFactory = clientFactory;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Celo mainnet chain id, latest block number, and current gas price.
|
|
38
|
+
* @returns Network metadata including `chainId`, `blockNumber`, and `gasPriceWei`
|
|
39
|
+
*/
|
|
40
|
+
async getNetworkStatus() {
|
|
41
|
+
const { public: client } = this.clientFactory.getClients();
|
|
42
|
+
const [chainId, blockNumber, gasPrice] = await Promise.all([
|
|
43
|
+
client.getChainId(),
|
|
44
|
+
client.getBlockNumber(),
|
|
45
|
+
client.getGasPrice(),
|
|
46
|
+
]);
|
|
47
|
+
return {
|
|
48
|
+
network: "mainnet",
|
|
49
|
+
chainId,
|
|
50
|
+
blockNumber: blockNumber.toString(),
|
|
51
|
+
gasPriceWei: gasPrice.toString(),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Fetch a block by number, hash, or tag.
|
|
56
|
+
* @param blockId - Block number, hash, `latest`, or `pending`
|
|
57
|
+
* @param options.includeTransactions - When true, include full transaction objects
|
|
58
|
+
* @returns Block header fields and optional transaction list
|
|
59
|
+
* @throws When the block is not found
|
|
60
|
+
*/
|
|
61
|
+
async getBlock(blockId, options) {
|
|
62
|
+
const { public: client } = this.clientFactory.getClients();
|
|
63
|
+
const includeTransactions = options?.includeTransactions ?? false;
|
|
64
|
+
const blockParams = typeof blockId === "number"
|
|
65
|
+
? {
|
|
66
|
+
blockNumber: BigInt(blockId),
|
|
67
|
+
includeTransactions,
|
|
68
|
+
}
|
|
69
|
+
: blockId === "latest" || blockId === "pending"
|
|
70
|
+
? {
|
|
71
|
+
blockTag: blockId,
|
|
72
|
+
includeTransactions,
|
|
73
|
+
}
|
|
74
|
+
: {
|
|
75
|
+
blockHash: blockId,
|
|
76
|
+
includeTransactions,
|
|
77
|
+
};
|
|
78
|
+
const block = await client.getBlock(blockParams);
|
|
79
|
+
if (!block) {
|
|
80
|
+
throw new Error(`Block not found: ${blockId}`);
|
|
81
|
+
}
|
|
82
|
+
const gasUtilization = block.gasLimit > 0n
|
|
83
|
+
? Number((block.gasUsed * 10000n) / block.gasLimit) / 100
|
|
84
|
+
: 0;
|
|
85
|
+
return {
|
|
86
|
+
number: block.number?.toString(),
|
|
87
|
+
hash: block.hash,
|
|
88
|
+
timestamp: block.timestamp.toString(),
|
|
89
|
+
parentHash: block.parentHash,
|
|
90
|
+
gasUsed: block.gasUsed.toString(),
|
|
91
|
+
gasLimit: block.gasLimit.toString(),
|
|
92
|
+
gasUtilization,
|
|
93
|
+
miner: block.miner,
|
|
94
|
+
transactionCount: block.transactions.length,
|
|
95
|
+
transactions: includeTransactions
|
|
96
|
+
? block.transactions.map((tx) => typeof tx === "string"
|
|
97
|
+
? tx
|
|
98
|
+
: serializeTransactionSummary(tx))
|
|
99
|
+
: undefined,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* List recent blocks ending at the chain tip (newest last in the array).
|
|
104
|
+
* @param count - Number of blocks to return (1–100, default 5)
|
|
105
|
+
* @param offset - Skip this many blocks from the tip before collecting
|
|
106
|
+
* @returns Summary fields per block (no full transaction payloads)
|
|
107
|
+
*/
|
|
108
|
+
async getLatestBlocks(count = 5, offset = 0) {
|
|
109
|
+
const { public: client } = this.clientFactory.getClients();
|
|
110
|
+
const latest = await client.getBlockNumber();
|
|
111
|
+
const safeCount = Math.min(Math.max(count, 1), 100);
|
|
112
|
+
const safeOffset = Math.max(offset, 0);
|
|
113
|
+
const start = latest - BigInt(safeOffset + safeCount - 1);
|
|
114
|
+
const blocks = await Promise.all(Array.from({ length: safeCount }, (_, index) => client.getBlock({ blockNumber: start + BigInt(index) })));
|
|
115
|
+
return blocks.filter(Boolean).map((block) => {
|
|
116
|
+
const gasUtilization = block.gasLimit > 0n
|
|
117
|
+
? Number((block.gasUsed * 10000n) / block.gasLimit) / 100
|
|
118
|
+
: 0;
|
|
119
|
+
return {
|
|
120
|
+
number: block.number?.toString(),
|
|
121
|
+
hash: block.hash,
|
|
122
|
+
timestamp: block.timestamp.toString(),
|
|
123
|
+
transactionCount: block.transactions.length,
|
|
124
|
+
gasUsed: block.gasUsed.toString(),
|
|
125
|
+
gasLimit: block.gasLimit.toString(),
|
|
126
|
+
gasUtilization,
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Fetch a transaction and its receipt by hash.
|
|
132
|
+
* @param hash - Transaction hash
|
|
133
|
+
* @returns Transaction fields, gas efficiency, and receipt status when mined
|
|
134
|
+
* @throws When the transaction is not found
|
|
135
|
+
*/
|
|
136
|
+
async getTransaction(hash) {
|
|
137
|
+
const { public: client } = this.clientFactory.getClients();
|
|
138
|
+
const [tx, receipt] = await Promise.all([
|
|
139
|
+
client.getTransaction({ hash }),
|
|
140
|
+
client.getTransactionReceipt({ hash }),
|
|
141
|
+
]);
|
|
142
|
+
if (!tx) {
|
|
143
|
+
throw new Error(`Transaction not found: ${hash}`);
|
|
144
|
+
}
|
|
145
|
+
return serializeTransactionSummary(tx, {
|
|
146
|
+
gasUsed: receipt?.gasUsed ?? 0n,
|
|
147
|
+
status: receipt?.status,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=blockchain.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockchain.service.js","sourceRoot":"","sources":["../../../src/services/blockchain.service.ts"],"names":[],"mappings":"AAmBA,SAAS,2BAA2B,CAClC,EAA2B,EAC3B,MAGC;IAED,MAAM,IAAI,GAAG;QACX,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,EAAE,EAAE,EAAE,CAAC,EAAE;QACT,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE;QAC1B,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI;QAClC,KAAK,EAAE,EAAE,CAAC,KAAK;QACf,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE;QACtB,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE;QACjC,YAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS;QACjE,KAAK,EAAE,EAAE,CAAC,KAAK;QACf,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE;QACvC,gBAAgB,EAAE,EAAE,CAAC,gBAAgB;QACrC,IAAI,EAAE,EAAE,CAAC,IAAI;KACd,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,aAAa,GACjB,EAAE,CAAC,GAAG,GAAG,EAAE;QACT,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG;QAClD,CAAC,CAAC,CAAC,CAAC;IAER,OAAO;QACL,GAAG,IAAI;QACP,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE;QAClC,aAAa;QACb,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClE,CAAC;AACJ,CAAC;AAED,kDAAkD;AAClD,MAAM,OAAO,iBAAiB;IACC;IAA7B,YAA6B,aAAgC;QAAhC,kBAAa,GAAb,aAAa,CAAmB;IAAG,CAAC;IAEjE;;;OAGG;IACH,KAAK,CAAC,gBAAgB;QACpB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAC3D,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACzD,MAAM,CAAC,UAAU,EAAE;YACnB,MAAM,CAAC,cAAc,EAAE;YACvB,MAAM,CAAC,WAAW,EAAE;SACrB,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,SAAS;YAClB,OAAO;YACP,WAAW,EAAE,WAAW,CAAC,QAAQ,EAAE;YACnC,WAAW,EAAE,QAAQ,CAAC,QAAQ,EAAE;SACjC,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,QAAQ,CACZ,OAA+C,EAC/C,OAA2C;QAE3C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAC3D,MAAM,mBAAmB,GAAG,OAAO,EAAE,mBAAmB,IAAI,KAAK,CAAC;QAElE,MAAM,WAAW,GACf,OAAO,OAAO,KAAK,QAAQ;YACzB,CAAC,CAAC;gBACE,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC;gBAC5B,mBAAmB;aACpB;YACH,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,SAAS;gBAC7C,CAAC,CAAC;oBACE,QAAQ,EAAE,OAA+B;oBACzC,mBAAmB;iBACpB;gBACH,CAAC,CAAC;oBACE,SAAS,EAAE,OAAwB;oBACnC,mBAAmB;iBACpB,CAAC;QAEV,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAEjD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,cAAc,GAClB,KAAK,CAAC,QAAQ,GAAG,EAAE;YACjB,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,GAAG;YACzD,CAAC,CAAC,CAAC,CAAC;QAER,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE;YAChC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE;YACrC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE;YACjC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE;YACnC,cAAc;YACd,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,gBAAgB,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM;YAC3C,YAAY,EAAE,mBAAmB;gBAC/B,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAC5B,OAAO,EAAE,KAAK,QAAQ;oBACpB,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,2BAA2B,CAAC,EAA6B,CAAC,CAC/D;gBACH,CAAC,CAAC,SAAS;SACd,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC;QACzC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAC3D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC,UAAU,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC;QAE1D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAC7C,MAAM,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CACxD,CACF,CAAC;QAEF,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC1C,MAAM,cAAc,GAClB,KAAM,CAAC,QAAQ,GAAG,EAAE;gBAClB,CAAC,CAAC,MAAM,CAAC,CAAC,KAAM,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,KAAM,CAAC,QAAQ,CAAC,GAAG,GAAG;gBAC3D,CAAC,CAAC,CAAC,CAAC;YACR,OAAO;gBACL,MAAM,EAAE,KAAM,CAAC,MAAM,EAAE,QAAQ,EAAE;gBACjC,IAAI,EAAE,KAAM,CAAC,IAAI;gBACjB,SAAS,EAAE,KAAM,CAAC,SAAS,CAAC,QAAQ,EAAE;gBACtC,gBAAgB,EAAE,KAAM,CAAC,YAAY,CAAC,MAAM;gBAC5C,OAAO,EAAE,KAAM,CAAC,OAAO,CAAC,QAAQ,EAAE;gBAClC,QAAQ,EAAE,KAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE;gBACpC,cAAc;aACf,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc,CAAC,IAAmB;QACtC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAC3D,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACtC,MAAM,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC;YAC/B,MAAM,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,CAAC;SACvC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,2BAA2B,CAAC,EAA6B,EAAE;YAChE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;YAC/B,MAAM,EAAE,OAAO,EAAE,MAAM;SACxB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic contract reads and gas estimates — caller supplies the ABI.
|
|
3
|
+
*/
|
|
4
|
+
import { type Abi } from "viem";
|
|
5
|
+
import type { CeloClientFactory } from "../clients/celo-client.js";
|
|
6
|
+
/** Parameters for a read-only or gas-estimated contract call on Celo mainnet. */
|
|
7
|
+
export interface ContractCallParams {
|
|
8
|
+
/** Target contract address. */
|
|
9
|
+
contractAddress: `0x${string}`;
|
|
10
|
+
/** ABI function name to invoke. */
|
|
11
|
+
functionName: string;
|
|
12
|
+
/** Contract ABI JSON (must include `functionName`). */
|
|
13
|
+
abi: Abi;
|
|
14
|
+
/** Positional arguments for the function (default `[]`). */
|
|
15
|
+
functionArgs?: unknown[];
|
|
16
|
+
/** Optional `msg.sender` for state-dependent view calls. */
|
|
17
|
+
fromAddress?: `0x${string}`;
|
|
18
|
+
/** Wei value as decimal string for payable calls (default `"0"`). */
|
|
19
|
+
value?: string;
|
|
20
|
+
}
|
|
21
|
+
/** Read-only and gas-estimation helpers for arbitrary contracts. */
|
|
22
|
+
export declare class ContractService {
|
|
23
|
+
private readonly clientFactory;
|
|
24
|
+
constructor(clientFactory: CeloClientFactory);
|
|
25
|
+
/**
|
|
26
|
+
* Simulate a read-only contract call (`eth_call`).
|
|
27
|
+
* @param params - Contract address, ABI, function name, and optional args
|
|
28
|
+
* @returns Decoded result on success; `{ success: false, error }` on revert
|
|
29
|
+
*/
|
|
30
|
+
callFunction(params: ContractCallParams): Promise<{
|
|
31
|
+
network: "mainnet";
|
|
32
|
+
contractAddress: `0x${string}`;
|
|
33
|
+
functionName: string;
|
|
34
|
+
result: unknown;
|
|
35
|
+
success: boolean;
|
|
36
|
+
error?: undefined;
|
|
37
|
+
} | {
|
|
38
|
+
network: "mainnet";
|
|
39
|
+
contractAddress: `0x${string}`;
|
|
40
|
+
functionName: string;
|
|
41
|
+
result: null;
|
|
42
|
+
success: boolean;
|
|
43
|
+
error: string;
|
|
44
|
+
}>;
|
|
45
|
+
/**
|
|
46
|
+
* Estimate gas for a contract call from `fromAddress`.
|
|
47
|
+
* @param params - Same as `callFunction` plus required `fromAddress`
|
|
48
|
+
* @returns Gas estimate, current gas price, and total cost in wei
|
|
49
|
+
*/
|
|
50
|
+
estimateGas(params: ContractCallParams & {
|
|
51
|
+
fromAddress: `0x${string}`;
|
|
52
|
+
}): Promise<{
|
|
53
|
+
network: "mainnet";
|
|
54
|
+
contractAddress: `0x${string}`;
|
|
55
|
+
functionName: string;
|
|
56
|
+
gasEstimate: string;
|
|
57
|
+
gasPrice: string;
|
|
58
|
+
totalCost: string;
|
|
59
|
+
success: boolean;
|
|
60
|
+
error?: undefined;
|
|
61
|
+
} | {
|
|
62
|
+
network: "mainnet";
|
|
63
|
+
contractAddress: `0x${string}`;
|
|
64
|
+
functionName: string;
|
|
65
|
+
gasEstimate: string;
|
|
66
|
+
gasPrice: string;
|
|
67
|
+
totalCost: string;
|
|
68
|
+
success: boolean;
|
|
69
|
+
error: string;
|
|
70
|
+
}>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Decode raw calldata result bytes using a single ABI function entry.
|
|
74
|
+
* @param abi - Contract ABI containing `functionName`
|
|
75
|
+
* @param functionName - Function whose return types define decoding
|
|
76
|
+
* @param data - Hex return data from `eth_call`
|
|
77
|
+
*/
|
|
78
|
+
export declare function decodeContractResult(abi: Abi, functionName: string, data: `0x${string}`): readonly unknown[];
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic contract reads and gas estimates — caller supplies the ABI.
|
|
3
|
+
*/
|
|
4
|
+
import { decodeFunctionResult, encodeFunctionData, } from "viem";
|
|
5
|
+
import { normalizeAddress } from "../utils/normalize-address.js";
|
|
6
|
+
function findAbiFunction(abi, functionName) {
|
|
7
|
+
const fn = abi.find((item) => item.type === "function" && item.name === functionName);
|
|
8
|
+
if (!fn) {
|
|
9
|
+
throw new Error(`Function "${functionName}" not found in ABI`);
|
|
10
|
+
}
|
|
11
|
+
return fn;
|
|
12
|
+
}
|
|
13
|
+
/** Read-only and gas-estimation helpers for arbitrary contracts. */
|
|
14
|
+
export class ContractService {
|
|
15
|
+
clientFactory;
|
|
16
|
+
constructor(clientFactory) {
|
|
17
|
+
this.clientFactory = clientFactory;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Simulate a read-only contract call (`eth_call`).
|
|
21
|
+
* @param params - Contract address, ABI, function name, and optional args
|
|
22
|
+
* @returns Decoded result on success; `{ success: false, error }` on revert
|
|
23
|
+
*/
|
|
24
|
+
async callFunction(params) {
|
|
25
|
+
const contractAddress = normalizeAddress(params.contractAddress, "contract address");
|
|
26
|
+
const fromAddress = params.fromAddress
|
|
27
|
+
? normalizeAddress(params.fromAddress, "from address")
|
|
28
|
+
: undefined;
|
|
29
|
+
const { public: client } = this.clientFactory.getClients();
|
|
30
|
+
const args = params.functionArgs ?? [];
|
|
31
|
+
try {
|
|
32
|
+
const result = await client.readContract({
|
|
33
|
+
address: contractAddress,
|
|
34
|
+
abi: params.abi,
|
|
35
|
+
functionName: params.functionName,
|
|
36
|
+
args: args,
|
|
37
|
+
...(fromAddress ? { account: fromAddress } : {}),
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
network: "mainnet",
|
|
41
|
+
contractAddress,
|
|
42
|
+
functionName: params.functionName,
|
|
43
|
+
result,
|
|
44
|
+
success: true,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return {
|
|
49
|
+
network: "mainnet",
|
|
50
|
+
contractAddress,
|
|
51
|
+
functionName: params.functionName,
|
|
52
|
+
result: null,
|
|
53
|
+
success: false,
|
|
54
|
+
error: error instanceof Error ? error.message : String(error),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Estimate gas for a contract call from `fromAddress`.
|
|
60
|
+
* @param params - Same as `callFunction` plus required `fromAddress`
|
|
61
|
+
* @returns Gas estimate, current gas price, and total cost in wei
|
|
62
|
+
*/
|
|
63
|
+
async estimateGas(params) {
|
|
64
|
+
const contractAddress = normalizeAddress(params.contractAddress, "contract address");
|
|
65
|
+
const fromAddress = normalizeAddress(params.fromAddress, "from address");
|
|
66
|
+
const { public: client } = this.clientFactory.getClients();
|
|
67
|
+
const args = params.functionArgs ?? [];
|
|
68
|
+
const value = params.value ? BigInt(params.value) : 0n;
|
|
69
|
+
try {
|
|
70
|
+
const data = encodeFunctionData({
|
|
71
|
+
abi: params.abi,
|
|
72
|
+
functionName: params.functionName,
|
|
73
|
+
args: args,
|
|
74
|
+
});
|
|
75
|
+
const gasEstimate = await client.estimateGas({
|
|
76
|
+
account: fromAddress,
|
|
77
|
+
to: contractAddress,
|
|
78
|
+
data,
|
|
79
|
+
value,
|
|
80
|
+
});
|
|
81
|
+
const gasPrice = await client.getGasPrice();
|
|
82
|
+
const totalCost = gasEstimate * gasPrice;
|
|
83
|
+
return {
|
|
84
|
+
network: "mainnet",
|
|
85
|
+
contractAddress,
|
|
86
|
+
functionName: params.functionName,
|
|
87
|
+
gasEstimate: gasEstimate.toString(),
|
|
88
|
+
gasPrice: gasPrice.toString(),
|
|
89
|
+
totalCost: totalCost.toString(),
|
|
90
|
+
success: true,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
return {
|
|
95
|
+
network: "mainnet",
|
|
96
|
+
contractAddress,
|
|
97
|
+
functionName: params.functionName,
|
|
98
|
+
gasEstimate: "0",
|
|
99
|
+
gasPrice: "0",
|
|
100
|
+
totalCost: "0",
|
|
101
|
+
success: false,
|
|
102
|
+
error: error instanceof Error ? error.message : String(error),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Decode raw calldata result bytes using a single ABI function entry.
|
|
109
|
+
* @param abi - Contract ABI containing `functionName`
|
|
110
|
+
* @param functionName - Function whose return types define decoding
|
|
111
|
+
* @param data - Hex return data from `eth_call`
|
|
112
|
+
*/
|
|
113
|
+
export function decodeContractResult(abi, functionName, data) {
|
|
114
|
+
const fn = findAbiFunction(abi, functionName);
|
|
115
|
+
return decodeFunctionResult({ abi: [fn], functionName, data });
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=contract.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.service.js","sourceRoot":"","sources":["../../../src/services/contract.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type EnsClientFactory } from "../clients/ens-client.js";
|
|
2
|
+
/** Chain used for ENS resolution. */
|
|
3
|
+
export type EnsResolveChain = "celo" | "ethereum";
|
|
4
|
+
/** Address with optional ENS metadata when input was a name. */
|
|
5
|
+
export type ResolvedRecipient = {
|
|
6
|
+
address: `0x${string}`;
|
|
7
|
+
ens?: {
|
|
8
|
+
name: string;
|
|
9
|
+
normalizedName: string;
|
|
10
|
+
/** Present when resolved on Celo (may fall back to Ethereum records). */
|
|
11
|
+
resolvedVia?: "celo" | "ethereum";
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
/** ENS name and address resolution for send/swap recipients. */
|
|
15
|
+
export declare class EnsService {
|
|
16
|
+
private readonly ensClientFactory;
|
|
17
|
+
constructor(ensClientFactory: EnsClientFactory);
|
|
18
|
+
/**
|
|
19
|
+
* Resolve an ENS name on Celo or Ethereum to an address.
|
|
20
|
+
* @param name - ENS name (e.g. `andrewkimjoseph.celo.eth`)
|
|
21
|
+
* @param chain - `"celo"` tries Celo coin type first, then Ethereum; `"ethereum"` uses ETH only
|
|
22
|
+
* @throws When no address record exists for the name
|
|
23
|
+
*/
|
|
24
|
+
resolveEns(name: string, chain?: EnsResolveChain): Promise<{
|
|
25
|
+
name: string;
|
|
26
|
+
normalizedName: string;
|
|
27
|
+
address: `0x${string}`;
|
|
28
|
+
coinType: string;
|
|
29
|
+
chain: "ethereum";
|
|
30
|
+
resolvedVia?: undefined;
|
|
31
|
+
} | {
|
|
32
|
+
name: string;
|
|
33
|
+
normalizedName: string;
|
|
34
|
+
address: `0x${string}`;
|
|
35
|
+
coinType: string;
|
|
36
|
+
chain: "celo";
|
|
37
|
+
resolvedVia: "celo" | "ethereum";
|
|
38
|
+
}>;
|
|
39
|
+
/**
|
|
40
|
+
* Accept a raw `0x` address or ENS name; returns address plus optional ENS metadata.
|
|
41
|
+
* @param input - Hex address or ENS name
|
|
42
|
+
*/
|
|
43
|
+
resolveAddressOrEns(input: string): Promise<ResolvedRecipient>;
|
|
44
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ENS resolution on Celo (coin type 42220) and Ethereum mainnet.
|
|
3
|
+
*/
|
|
4
|
+
import { toCoinType } from "viem";
|
|
5
|
+
import { celo } from "viem/chains";
|
|
6
|
+
import { getEnsAddress, normalize } from "viem/ens";
|
|
7
|
+
import { ENS_CCIP_GATEWAY, } from "../clients/ens-client.js";
|
|
8
|
+
const ADDRESS_PATTERN = /^0x[a-fA-F0-9]{40}$/;
|
|
9
|
+
/** ENS name and address resolution for send/swap recipients. */
|
|
10
|
+
export class EnsService {
|
|
11
|
+
ensClientFactory;
|
|
12
|
+
constructor(ensClientFactory) {
|
|
13
|
+
this.ensClientFactory = ensClientFactory;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Resolve an ENS name on Celo or Ethereum to an address.
|
|
17
|
+
* @param name - ENS name (e.g. `andrewkimjoseph.celo.eth`)
|
|
18
|
+
* @param chain - `"celo"` tries Celo coin type first, then Ethereum; `"ethereum"` uses ETH only
|
|
19
|
+
* @throws When no address record exists for the name
|
|
20
|
+
*/
|
|
21
|
+
async resolveEns(name, chain = "celo") {
|
|
22
|
+
const trimmedName = name.trim();
|
|
23
|
+
const normalizedName = normalize(trimmedName);
|
|
24
|
+
const client = this.ensClientFactory.getClient();
|
|
25
|
+
const gatewayUrls = [ENS_CCIP_GATEWAY];
|
|
26
|
+
if (chain === "ethereum") {
|
|
27
|
+
const address = await getEnsAddress(client, {
|
|
28
|
+
name: normalizedName,
|
|
29
|
+
gatewayUrls,
|
|
30
|
+
});
|
|
31
|
+
if (!address) {
|
|
32
|
+
throw new Error(`ENS name "${trimmedName}" has no Ethereum address record`);
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
name: trimmedName,
|
|
36
|
+
normalizedName,
|
|
37
|
+
address,
|
|
38
|
+
coinType: "60",
|
|
39
|
+
chain: "ethereum",
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const celoCoinType = toCoinType(celo.id);
|
|
43
|
+
let address = await getEnsAddress(client, {
|
|
44
|
+
name: normalizedName,
|
|
45
|
+
coinType: celoCoinType,
|
|
46
|
+
gatewayUrls,
|
|
47
|
+
});
|
|
48
|
+
let coinType = celoCoinType.toString();
|
|
49
|
+
let resolvedVia = "celo";
|
|
50
|
+
if (!address) {
|
|
51
|
+
address = await getEnsAddress(client, {
|
|
52
|
+
name: normalizedName,
|
|
53
|
+
gatewayUrls,
|
|
54
|
+
});
|
|
55
|
+
coinType = "60";
|
|
56
|
+
resolvedVia = "ethereum";
|
|
57
|
+
}
|
|
58
|
+
if (!address) {
|
|
59
|
+
throw new Error(`ENS name "${trimmedName}" could not be resolved to an address`);
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
name: trimmedName,
|
|
63
|
+
normalizedName,
|
|
64
|
+
address,
|
|
65
|
+
coinType,
|
|
66
|
+
chain: "celo",
|
|
67
|
+
resolvedVia,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Accept a raw `0x` address or ENS name; returns address plus optional ENS metadata.
|
|
72
|
+
* @param input - Hex address or ENS name
|
|
73
|
+
*/
|
|
74
|
+
async resolveAddressOrEns(input) {
|
|
75
|
+
const trimmed = input.trim();
|
|
76
|
+
if (ADDRESS_PATTERN.test(trimmed)) {
|
|
77
|
+
return { address: trimmed };
|
|
78
|
+
}
|
|
79
|
+
const resolved = await this.resolveEns(trimmed);
|
|
80
|
+
return {
|
|
81
|
+
address: resolved.address,
|
|
82
|
+
ens: {
|
|
83
|
+
name: resolved.name,
|
|
84
|
+
normalizedName: resolved.normalizedName,
|
|
85
|
+
...(resolved.chain === "celo"
|
|
86
|
+
? { resolvedVia: resolved.resolvedVia }
|
|
87
|
+
: {}),
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=ens.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ens.service.js","sourceRoot":"","sources":["../../../src/services/ens.service.ts"],"names":[],"mappings":"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"}
|