@unionlabs/payments 0.1.0 → 0.2.0
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/Abi/package.json +6 -0
- package/Attestor/package.json +6 -0
- package/Constants/package.json +6 -0
- package/Domain/package.json +6 -0
- package/Error/package.json +6 -0
- package/EvmPublicClient/package.json +6 -0
- package/EvmWalletClient/package.json +6 -0
- package/Payment/package.json +6 -0
- package/PaymentError/package.json +6 -0
- package/Prover/package.json +6 -0
- package/PublicClient/package.json +6 -0
- package/README.md +1 -0
- package/Schema/package.json +6 -0
- package/Utils/package.json +6 -0
- package/WalletClient/package.json +6 -0
- package/attestation/package.json +6 -0
- package/cli/commands/balance/package.json +6 -0
- package/cli/commands/deposit/package.json +6 -0
- package/cli/commands/export-verifier/package.json +6 -0
- package/cli/commands/generate/package.json +6 -0
- package/cli/commands/history/package.json +6 -0
- package/cli/commands/prove/package.json +6 -0
- package/cli/commands/redeem/package.json +6 -0
- package/cli/commands/update-client/package.json +6 -0
- package/cli/config/package.json +6 -0
- package/cli/package.json +6 -0
- package/cli/utils/package.json +6 -0
- package/constants/ibc-core-registry/package.json +6 -0
- package/constants/services/package.json +6 -0
- package/constants/z-asset-registry/package.json +6 -0
- package/dist/cjs/Abi.js +270 -0
- package/dist/cjs/Abi.js.map +1 -0
- package/dist/cjs/Attestor.js +76 -0
- package/dist/cjs/Attestor.js.map +1 -0
- package/dist/cjs/Constants.js +8 -0
- package/dist/cjs/Constants.js.map +1 -0
- package/dist/cjs/Domain.js +24 -0
- package/dist/cjs/Domain.js.map +1 -0
- package/dist/cjs/Error.js +100 -0
- package/dist/cjs/Error.js.map +1 -0
- package/dist/cjs/EvmPublicClient.js +301 -0
- package/dist/cjs/EvmPublicClient.js.map +1 -0
- package/dist/cjs/EvmWalletClient.js +670 -0
- package/dist/cjs/EvmWalletClient.js.map +1 -0
- package/dist/cjs/Payment.js +333 -0
- package/dist/cjs/Payment.js.map +1 -0
- package/dist/cjs/PaymentError.js +32 -0
- package/dist/cjs/PaymentError.js.map +1 -0
- package/dist/cjs/Prover.js +153 -0
- package/dist/cjs/Prover.js.map +1 -0
- package/dist/cjs/PublicClient.js +39 -0
- package/dist/cjs/PublicClient.js.map +1 -0
- package/dist/cjs/Schema.js +38 -0
- package/dist/cjs/Schema.js.map +1 -0
- package/dist/cjs/Utils.js +33 -0
- package/dist/cjs/Utils.js.map +1 -0
- package/dist/cjs/WalletClient.js +39 -0
- package/dist/cjs/WalletClient.js.map +1 -0
- package/dist/cjs/attestation.js +49 -0
- package/dist/cjs/attestation.js.map +1 -0
- package/dist/cjs/cli/commands/balance.js +60 -0
- package/dist/cjs/cli/commands/balance.js.map +1 -0
- package/dist/cjs/cli/commands/deposit.js +58 -0
- package/dist/cjs/cli/commands/deposit.js.map +1 -0
- package/dist/cjs/cli/commands/export-verifier.js +27 -0
- package/dist/cjs/cli/commands/export-verifier.js.map +1 -0
- package/dist/cjs/cli/commands/generate.js +41 -0
- package/dist/cjs/cli/commands/generate.js.map +1 -0
- package/dist/cjs/cli/commands/history.js +59 -0
- package/dist/cjs/cli/commands/history.js.map +1 -0
- package/dist/cjs/cli/commands/prove.js +82 -0
- package/dist/cjs/cli/commands/prove.js.map +1 -0
- package/dist/cjs/cli/commands/redeem.js +152 -0
- package/dist/cjs/cli/commands/redeem.js.map +1 -0
- package/dist/cjs/cli/commands/update-client.js +62 -0
- package/dist/cjs/cli/commands/update-client.js.map +1 -0
- package/dist/cjs/cli/config.js +32 -0
- package/dist/cjs/cli/config.js.map +1 -0
- package/dist/cjs/cli/utils.js +108 -0
- package/dist/cjs/cli/utils.js.map +1 -0
- package/dist/cjs/cli.js +24 -0
- package/dist/cjs/cli.js.map +1 -0
- package/dist/cjs/constants/ibc-core-registry.js +30 -0
- package/dist/cjs/constants/ibc-core-registry.js.map +1 -0
- package/dist/cjs/constants/services.js +9 -0
- package/dist/cjs/constants/services.js.map +1 -0
- package/dist/cjs/constants/z-asset-registry.js +32 -0
- package/dist/cjs/constants/z-asset-registry.js.map +1 -0
- package/dist/cjs/gen/prover_pb.js +81 -0
- package/dist/cjs/gen/prover_pb.js.map +1 -0
- package/dist/cjs/index.js +32 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/internal/evm.js +191 -0
- package/dist/cjs/internal/evm.js.map +1 -0
- package/dist/cjs/internal/evmWalletClient.js +6 -0
- package/dist/cjs/internal/evmWalletClient.js.map +1 -0
- package/dist/cjs/internal/publicClient.js +49 -0
- package/dist/cjs/internal/publicClient.js.map +1 -0
- package/dist/cjs/internal/walletClient.js +43 -0
- package/dist/cjs/internal/walletClient.js.map +1 -0
- package/dist/cjs/legacy/client.js +1222 -0
- package/dist/cjs/legacy/client.js.map +1 -0
- package/dist/cjs/legacy/prover.js +112 -0
- package/dist/cjs/legacy/prover.js.map +1 -0
- package/dist/cjs/poseidon2.js +226 -0
- package/dist/cjs/poseidon2.js.map +1 -0
- package/dist/cjs/promises/Attestor.js +23 -0
- package/dist/cjs/promises/Attestor.js.map +1 -0
- package/dist/cjs/promises/EvmPublicClient.js +34 -0
- package/dist/cjs/promises/EvmPublicClient.js.map +1 -0
- package/dist/cjs/promises/EvmWalletClient.js +51 -0
- package/dist/cjs/promises/EvmWalletClient.js.map +1 -0
- package/dist/cjs/promises/Payment.js +22 -0
- package/dist/cjs/promises/Payment.js.map +1 -0
- package/dist/cjs/promises/Prover.js +26 -0
- package/dist/cjs/promises/Prover.js.map +1 -0
- package/dist/cjs/promises/PublicClient.js +53 -0
- package/dist/cjs/promises/PublicClient.js.map +1 -0
- package/dist/cjs/promises/WalletClient.js +44 -0
- package/dist/cjs/promises/WalletClient.js.map +1 -0
- package/dist/cjs/promises/index.js +22 -0
- package/dist/cjs/promises/index.js.map +1 -0
- package/dist/cjs/rpc.js +867 -0
- package/dist/cjs/rpc.js.map +1 -0
- package/dist/cjs/types.js +6 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/dts/Abi.d.ts +220 -0
- package/dist/dts/Abi.d.ts.map +1 -0
- package/dist/dts/Attestor.d.ts +42 -0
- package/dist/dts/Attestor.d.ts.map +1 -0
- package/dist/dts/Constants.d.ts +3 -0
- package/dist/dts/Constants.d.ts.map +1 -0
- package/dist/dts/Domain.d.ts +141 -0
- package/dist/dts/Domain.d.ts.map +1 -0
- package/dist/dts/Error.d.ts +102 -0
- package/dist/dts/Error.d.ts.map +1 -0
- package/dist/dts/EvmPublicClient.d.ts +61 -0
- package/dist/dts/EvmPublicClient.d.ts.map +1 -0
- package/dist/dts/EvmWalletClient.d.ts +67 -0
- package/dist/dts/EvmWalletClient.d.ts.map +1 -0
- package/dist/dts/Payment.d.ts +128 -0
- package/dist/dts/Payment.d.ts.map +1 -0
- package/dist/dts/PaymentError.d.ts +21 -0
- package/dist/dts/PaymentError.d.ts.map +1 -0
- package/dist/dts/Prover.d.ts +87 -0
- package/dist/dts/Prover.d.ts.map +1 -0
- package/dist/dts/PublicClient.d.ts +146 -0
- package/dist/dts/PublicClient.d.ts.map +1 -0
- package/dist/dts/Schema.d.ts +16 -0
- package/dist/dts/Schema.d.ts.map +1 -0
- package/dist/dts/Utils.d.ts +11 -0
- package/dist/dts/Utils.d.ts.map +1 -0
- package/dist/dts/WalletClient.d.ts +123 -0
- package/dist/dts/WalletClient.d.ts.map +1 -0
- package/dist/dts/attestation.d.ts +13 -0
- package/dist/dts/attestation.d.ts.map +1 -0
- package/dist/dts/cli/commands/balance.d.ts +3 -0
- package/dist/dts/cli/commands/balance.d.ts.map +1 -0
- package/dist/dts/cli/commands/deposit.d.ts +3 -0
- package/dist/dts/cli/commands/deposit.d.ts.map +1 -0
- package/dist/dts/cli/commands/export-verifier.d.ts +3 -0
- package/dist/dts/cli/commands/export-verifier.d.ts.map +1 -0
- package/dist/dts/cli/commands/generate.d.ts +3 -0
- package/dist/dts/cli/commands/generate.d.ts.map +1 -0
- package/dist/dts/cli/commands/history.d.ts +3 -0
- package/dist/dts/cli/commands/history.d.ts.map +1 -0
- package/dist/dts/cli/commands/prove.d.ts +3 -0
- package/dist/dts/cli/commands/prove.d.ts.map +1 -0
- package/dist/dts/cli/commands/redeem.d.ts +3 -0
- package/dist/dts/cli/commands/redeem.d.ts.map +1 -0
- package/dist/dts/cli/commands/update-client.d.ts +3 -0
- package/dist/dts/cli/commands/update-client.d.ts.map +1 -0
- package/dist/dts/cli/config.d.ts +14 -0
- package/dist/dts/cli/config.d.ts.map +1 -0
- package/dist/dts/cli/utils.d.ts +11 -0
- package/dist/dts/cli/utils.d.ts.map +1 -0
- package/dist/dts/cli.d.ts +3 -0
- package/dist/dts/cli.d.ts.map +1 -0
- package/dist/dts/constants/ibc-core-registry.d.ts +11 -0
- package/dist/dts/constants/ibc-core-registry.d.ts.map +1 -0
- package/dist/dts/constants/services.d.ts +3 -0
- package/dist/dts/constants/services.d.ts.map +1 -0
- package/dist/dts/constants/z-asset-registry.d.ts +13 -0
- package/dist/dts/constants/z-asset-registry.d.ts.map +1 -0
- package/dist/dts/gen/prover_pb.d.ts +300 -0
- package/dist/dts/gen/prover_pb.d.ts.map +1 -0
- package/dist/dts/index.d.ts +21 -0
- package/dist/dts/index.d.ts.map +1 -0
- package/dist/dts/internal/evm.d.ts +250 -0
- package/dist/dts/internal/evm.d.ts.map +1 -0
- package/dist/dts/internal/evmWalletClient.d.ts +2 -0
- package/dist/dts/internal/evmWalletClient.d.ts.map +1 -0
- package/dist/dts/internal/publicClient.d.ts +2 -0
- package/dist/dts/internal/publicClient.d.ts.map +1 -0
- package/dist/dts/internal/walletClient.d.ts +2 -0
- package/dist/dts/internal/walletClient.d.ts.map +1 -0
- package/dist/dts/legacy/client.d.ts +313 -0
- package/dist/dts/legacy/client.d.ts.map +1 -0
- package/dist/dts/legacy/prover.d.ts +30 -0
- package/dist/dts/legacy/prover.d.ts.map +1 -0
- package/dist/dts/poseidon2.d.ts +18 -0
- package/dist/dts/poseidon2.d.ts.map +1 -0
- package/dist/dts/promises/Attestor.d.ts +17 -0
- package/dist/dts/promises/Attestor.d.ts.map +1 -0
- package/dist/dts/promises/EvmPublicClient.d.ts +3709 -0
- package/dist/dts/promises/EvmPublicClient.d.ts.map +1 -0
- package/dist/dts/promises/EvmWalletClient.d.ts +4502 -0
- package/dist/dts/promises/EvmWalletClient.d.ts.map +1 -0
- package/dist/dts/promises/Payment.d.ts +33 -0
- package/dist/dts/promises/Payment.d.ts.map +1 -0
- package/dist/dts/promises/Prover.d.ts +14 -0
- package/dist/dts/promises/Prover.d.ts.map +1 -0
- package/dist/dts/promises/PublicClient.d.ts +23 -0
- package/dist/dts/promises/PublicClient.d.ts.map +1 -0
- package/dist/dts/promises/WalletClient.d.ts +57 -0
- package/dist/dts/promises/WalletClient.d.ts.map +1 -0
- package/dist/dts/promises/index.d.ts +8 -0
- package/dist/dts/promises/index.d.ts.map +1 -0
- package/dist/dts/rpc.d.ts +148 -0
- package/dist/dts/rpc.d.ts.map +1 -0
- package/dist/dts/types.d.ts +263 -0
- package/dist/dts/types.d.ts.map +1 -0
- package/dist/esm/Abi.js +264 -0
- package/dist/esm/Abi.js.map +1 -0
- package/dist/esm/Attestor.js +68 -0
- package/dist/esm/Attestor.js.map +1 -0
- package/dist/esm/Constants.js +2 -0
- package/dist/esm/Constants.js.map +1 -0
- package/dist/esm/Domain.js +17 -0
- package/dist/esm/Domain.js.map +1 -0
- package/dist/esm/Error.js +89 -0
- package/dist/esm/Error.js.map +1 -0
- package/dist/esm/EvmPublicClient.js +292 -0
- package/dist/esm/EvmPublicClient.js.map +1 -0
- package/dist/esm/EvmWalletClient.js +659 -0
- package/dist/esm/EvmWalletClient.js.map +1 -0
- package/dist/esm/Payment.js +323 -0
- package/dist/esm/Payment.js.map +1 -0
- package/dist/esm/PaymentError.js +24 -0
- package/dist/esm/PaymentError.js.map +1 -0
- package/dist/esm/Prover.js +142 -0
- package/dist/esm/Prover.js.map +1 -0
- package/dist/esm/PublicClient.js +30 -0
- package/dist/esm/PublicClient.js.map +1 -0
- package/dist/esm/Schema.js +31 -0
- package/dist/esm/Schema.js.map +1 -0
- package/dist/esm/Utils.js +27 -0
- package/dist/esm/Utils.js.map +1 -0
- package/dist/esm/WalletClient.js +30 -0
- package/dist/esm/WalletClient.js.map +1 -0
- package/dist/esm/attestation.js +42 -0
- package/dist/esm/attestation.js.map +1 -0
- package/dist/esm/cli/commands/balance.js +54 -0
- package/dist/esm/cli/commands/balance.js.map +1 -0
- package/dist/esm/cli/commands/deposit.js +52 -0
- package/dist/esm/cli/commands/deposit.js.map +1 -0
- package/dist/esm/cli/commands/export-verifier.js +21 -0
- package/dist/esm/cli/commands/export-verifier.js.map +1 -0
- package/dist/esm/cli/commands/generate.js +35 -0
- package/dist/esm/cli/commands/generate.js.map +1 -0
- package/dist/esm/cli/commands/history.js +53 -0
- package/dist/esm/cli/commands/history.js.map +1 -0
- package/dist/esm/cli/commands/prove.js +76 -0
- package/dist/esm/cli/commands/prove.js.map +1 -0
- package/dist/esm/cli/commands/redeem.js +146 -0
- package/dist/esm/cli/commands/redeem.js.map +1 -0
- package/dist/esm/cli/commands/update-client.js +56 -0
- package/dist/esm/cli/commands/update-client.js.map +1 -0
- package/dist/esm/cli/config.js +26 -0
- package/dist/esm/cli/config.js.map +1 -0
- package/dist/esm/cli/utils.js +94 -0
- package/dist/esm/cli/utils.js.map +1 -0
- package/dist/esm/cli.js +22 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/constants/ibc-core-registry.js +21 -0
- package/dist/esm/constants/ibc-core-registry.js.map +1 -0
- package/dist/esm/constants/services.js +3 -0
- package/dist/esm/constants/services.js.map +1 -0
- package/dist/esm/constants/z-asset-registry.js +23 -0
- package/dist/esm/constants/z-asset-registry.js.map +1 -0
- package/dist/esm/gen/prover_pb.js +74 -0
- package/dist/esm/gen/prover_pb.js.map +1 -0
- package/dist/esm/index.js +22 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal/evm.js +169 -0
- package/dist/esm/internal/evm.js.map +1 -0
- package/dist/esm/internal/evmWalletClient.js +2 -0
- package/dist/esm/internal/evmWalletClient.js.map +1 -0
- package/dist/esm/internal/publicClient.js +41 -0
- package/dist/esm/internal/publicClient.js.map +1 -0
- package/dist/esm/internal/walletClient.js +35 -0
- package/dist/esm/internal/walletClient.js.map +1 -0
- package/dist/esm/legacy/client.js +1212 -0
- package/dist/esm/legacy/client.js.map +1 -0
- package/dist/esm/legacy/prover.js +105 -0
- package/dist/esm/legacy/prover.js.map +1 -0
- package/dist/esm/package.json +4 -0
- package/dist/esm/poseidon2.js +218 -0
- package/dist/esm/poseidon2.js.map +1 -0
- package/dist/esm/promises/Attestor.js +14 -0
- package/dist/esm/promises/Attestor.js.map +1 -0
- package/dist/esm/promises/EvmPublicClient.js +26 -0
- package/dist/esm/promises/EvmPublicClient.js.map +1 -0
- package/dist/esm/promises/EvmWalletClient.js +43 -0
- package/dist/esm/promises/EvmWalletClient.js.map +1 -0
- package/dist/esm/promises/Payment.js +13 -0
- package/dist/esm/promises/Payment.js.map +1 -0
- package/dist/esm/promises/Prover.js +17 -0
- package/dist/esm/promises/Prover.js.map +1 -0
- package/dist/esm/promises/PublicClient.js +45 -0
- package/dist/esm/promises/PublicClient.js.map +1 -0
- package/dist/esm/promises/WalletClient.js +36 -0
- package/dist/esm/promises/WalletClient.js.map +1 -0
- package/dist/esm/promises/index.js +8 -0
- package/dist/esm/promises/index.js.map +1 -0
- package/dist/esm/rpc.js +850 -0
- package/dist/esm/rpc.js.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/gen/prover_pb/package.json +6 -0
- package/index/package.json +6 -0
- package/legacy/client/package.json +6 -0
- package/legacy/prover/package.json +6 -0
- package/package.json +397 -44
- package/poseidon2/package.json +6 -0
- package/promises/Attestor/package.json +6 -0
- package/promises/EvmPublicClient/package.json +6 -0
- package/promises/EvmWalletClient/package.json +6 -0
- package/promises/Payment/package.json +6 -0
- package/promises/Prover/package.json +6 -0
- package/promises/PublicClient/package.json +6 -0
- package/promises/WalletClient/package.json +6 -0
- package/promises/index/package.json +6 -0
- package/promises/package.json +6 -0
- package/rpc/package.json +6 -0
- package/src/Abi.ts +195 -0
- package/src/Attestor.ts +113 -0
- package/src/Constants.ts +4 -0
- package/src/Domain.ts +52 -0
- package/src/Error.ts +163 -0
- package/src/EvmPublicClient.ts +549 -0
- package/src/EvmWalletClient.ts +1034 -0
- package/src/Payment.ts +523 -0
- package/src/PaymentError.ts +39 -0
- package/src/Prover.ts +240 -0
- package/src/PublicClient.ts +196 -0
- package/src/Schema.ts +36 -0
- package/src/Utils.ts +43 -0
- package/src/WalletClient.ts +172 -0
- package/src/attestation.ts +69 -0
- package/src/cli/commands/balance.ts +88 -0
- package/src/cli/commands/deposit.ts +104 -0
- package/src/cli/commands/export-verifier.ts +28 -0
- package/src/cli/commands/generate.ts +86 -0
- package/src/cli/commands/history.ts +91 -0
- package/src/cli/commands/prove.ts +133 -0
- package/src/cli/commands/redeem.ts +277 -0
- package/src/cli/commands/update-client.ts +96 -0
- package/src/cli/config.ts +55 -0
- package/src/cli/utils.ts +136 -0
- package/src/cli.ts +31 -0
- package/src/constants/ibc-core-registry.ts +44 -0
- package/src/constants/services.ts +4 -0
- package/src/constants/z-asset-registry.ts +47 -0
- package/src/gen/prover_pb.ts +375 -0
- package/src/index.ts +23 -0
- package/src/internal/evm.ts +361 -0
- package/src/internal/evmWalletClient.ts +0 -0
- package/src/internal/publicClient.ts +57 -0
- package/src/internal/walletClient.ts +50 -0
- package/src/legacy/client.ts +1652 -0
- package/src/legacy/prover.ts +135 -0
- package/src/poseidon2.ts +246 -0
- package/src/promises/Attestor.ts +25 -0
- package/src/promises/EvmPublicClient.ts +39 -0
- package/src/promises/EvmWalletClient.ts +63 -0
- package/src/promises/Payment.ts +86 -0
- package/src/promises/Prover.ts +26 -0
- package/src/promises/PublicClient.ts +47 -0
- package/src/promises/WalletClient.ts +38 -0
- package/src/promises/index.ts +7 -0
- package/src/rpc.ts +994 -0
- package/src/types.ts +281 -0
- package/types/package.json +6 -0
- package/dist/LICENSE +0 -1
- package/dist/chunk-37PNLRA6.js +0 -2418
- package/dist/cli.cjs +0 -3031
- package/dist/cli.js +0 -675
- package/dist/index.cjs +0 -2451
- package/dist/index.js +0 -1
- package/dist/package.json +0 -18
- package/dist/payments.d.ts +0 -835
- /package/{dist → src}/tsdoc-metadata.json +0 -0
package/dist/cjs/rpc.js
ADDED
|
@@ -0,0 +1,867 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.RpcClient = exports.IBC_STORE_ABI = void 0;
|
|
7
|
+
exports.computeStorageSlot = computeStorageSlot;
|
|
8
|
+
exports.depositToZAsset = depositToZAsset;
|
|
9
|
+
exports.deterministicShuffleClients = deterministicShuffleClients;
|
|
10
|
+
exports.fetchLightClients = fetchLightClients;
|
|
11
|
+
exports.fetchMptProof = fetchMptProof;
|
|
12
|
+
exports.parseProofJson = parseProofJson;
|
|
13
|
+
exports.proofJsonToRedeemParams = proofJsonToRedeemParams;
|
|
14
|
+
exports.signAttestedMessage = signAttestedMessage;
|
|
15
|
+
exports.submitRedeem = submitRedeem;
|
|
16
|
+
exports.updateLoopbackClient = updateLoopbackClient;
|
|
17
|
+
var _viem = require("viem");
|
|
18
|
+
var _accounts = require("viem/accounts");
|
|
19
|
+
const ERC20_ABI = [{
|
|
20
|
+
inputs: [{
|
|
21
|
+
name: "account",
|
|
22
|
+
type: "address"
|
|
23
|
+
}],
|
|
24
|
+
name: "balanceOf",
|
|
25
|
+
outputs: [{
|
|
26
|
+
name: "",
|
|
27
|
+
type: "uint256"
|
|
28
|
+
}],
|
|
29
|
+
stateMutability: "view",
|
|
30
|
+
type: "function"
|
|
31
|
+
}, {
|
|
32
|
+
inputs: [],
|
|
33
|
+
name: "decimals",
|
|
34
|
+
outputs: [{
|
|
35
|
+
name: "",
|
|
36
|
+
type: "uint8"
|
|
37
|
+
}],
|
|
38
|
+
stateMutability: "view",
|
|
39
|
+
type: "function"
|
|
40
|
+
}, {
|
|
41
|
+
inputs: [],
|
|
42
|
+
name: "symbol",
|
|
43
|
+
outputs: [{
|
|
44
|
+
name: "",
|
|
45
|
+
type: "string"
|
|
46
|
+
}],
|
|
47
|
+
stateMutability: "view",
|
|
48
|
+
type: "function"
|
|
49
|
+
}, {
|
|
50
|
+
inputs: [{
|
|
51
|
+
name: "spender",
|
|
52
|
+
type: "address"
|
|
53
|
+
}, {
|
|
54
|
+
name: "amount",
|
|
55
|
+
type: "uint256"
|
|
56
|
+
}],
|
|
57
|
+
name: "approve",
|
|
58
|
+
outputs: [{
|
|
59
|
+
name: "",
|
|
60
|
+
type: "bool"
|
|
61
|
+
}],
|
|
62
|
+
stateMutability: "nonpayable",
|
|
63
|
+
type: "function"
|
|
64
|
+
}, {
|
|
65
|
+
inputs: [{
|
|
66
|
+
name: "to",
|
|
67
|
+
type: "address"
|
|
68
|
+
}, {
|
|
69
|
+
name: "amount",
|
|
70
|
+
type: "uint256"
|
|
71
|
+
}],
|
|
72
|
+
name: "transfer",
|
|
73
|
+
outputs: [{
|
|
74
|
+
name: "",
|
|
75
|
+
type: "bool"
|
|
76
|
+
}],
|
|
77
|
+
stateMutability: "nonpayable",
|
|
78
|
+
type: "function"
|
|
79
|
+
}, {
|
|
80
|
+
inputs: [{
|
|
81
|
+
name: "from",
|
|
82
|
+
type: "address"
|
|
83
|
+
}, {
|
|
84
|
+
name: "to",
|
|
85
|
+
type: "address"
|
|
86
|
+
}, {
|
|
87
|
+
name: "amount",
|
|
88
|
+
type: "uint256"
|
|
89
|
+
}],
|
|
90
|
+
name: "transferFrom",
|
|
91
|
+
outputs: [{
|
|
92
|
+
name: "",
|
|
93
|
+
type: "bool"
|
|
94
|
+
}],
|
|
95
|
+
stateMutability: "nonpayable",
|
|
96
|
+
type: "function"
|
|
97
|
+
}];
|
|
98
|
+
const IBC_STORE_ABI = exports.IBC_STORE_ABI = [{
|
|
99
|
+
inputs: [{
|
|
100
|
+
name: "clientId",
|
|
101
|
+
type: "uint32"
|
|
102
|
+
}],
|
|
103
|
+
name: "getClient",
|
|
104
|
+
outputs: [{
|
|
105
|
+
name: "",
|
|
106
|
+
type: "address"
|
|
107
|
+
}],
|
|
108
|
+
stateMutability: "view",
|
|
109
|
+
type: "function"
|
|
110
|
+
}];
|
|
111
|
+
const LIGHT_CLIENT_ABI = [{
|
|
112
|
+
inputs: [{
|
|
113
|
+
name: "clientId",
|
|
114
|
+
type: "uint32"
|
|
115
|
+
}],
|
|
116
|
+
name: "getLatestHeight",
|
|
117
|
+
outputs: [{
|
|
118
|
+
name: "",
|
|
119
|
+
type: "uint64"
|
|
120
|
+
}],
|
|
121
|
+
stateMutability: "view",
|
|
122
|
+
type: "function"
|
|
123
|
+
}, {
|
|
124
|
+
inputs: [{
|
|
125
|
+
name: "clientId",
|
|
126
|
+
type: "uint32"
|
|
127
|
+
}, {
|
|
128
|
+
name: "height",
|
|
129
|
+
type: "uint64"
|
|
130
|
+
}],
|
|
131
|
+
name: "getConsensusState",
|
|
132
|
+
outputs: [{
|
|
133
|
+
name: "",
|
|
134
|
+
type: "bytes"
|
|
135
|
+
}],
|
|
136
|
+
stateMutability: "view",
|
|
137
|
+
type: "function"
|
|
138
|
+
}];
|
|
139
|
+
const ZASSET_ABI = [{
|
|
140
|
+
inputs: [{
|
|
141
|
+
name: "nullifier",
|
|
142
|
+
type: "uint256"
|
|
143
|
+
}],
|
|
144
|
+
name: "nullifierBalance",
|
|
145
|
+
outputs: [{
|
|
146
|
+
name: "",
|
|
147
|
+
type: "uint256"
|
|
148
|
+
}],
|
|
149
|
+
stateMutability: "view",
|
|
150
|
+
type: "function"
|
|
151
|
+
}, {
|
|
152
|
+
inputs: [{
|
|
153
|
+
name: "clientId",
|
|
154
|
+
type: "uint32"
|
|
155
|
+
}],
|
|
156
|
+
name: "counterparty",
|
|
157
|
+
outputs: [{
|
|
158
|
+
components: [{
|
|
159
|
+
name: "tokenAddressKey",
|
|
160
|
+
type: "bytes32"
|
|
161
|
+
}, {
|
|
162
|
+
name: "balanceSlot",
|
|
163
|
+
type: "bytes32"
|
|
164
|
+
}],
|
|
165
|
+
type: "tuple"
|
|
166
|
+
}],
|
|
167
|
+
stateMutability: "view",
|
|
168
|
+
type: "function"
|
|
169
|
+
}, {
|
|
170
|
+
inputs: [],
|
|
171
|
+
name: "ibcHandler",
|
|
172
|
+
outputs: [{
|
|
173
|
+
name: "",
|
|
174
|
+
type: "address"
|
|
175
|
+
}],
|
|
176
|
+
stateMutability: "view",
|
|
177
|
+
type: "function"
|
|
178
|
+
}, {
|
|
179
|
+
inputs: [{
|
|
180
|
+
name: "clientId",
|
|
181
|
+
type: "uint32"
|
|
182
|
+
}],
|
|
183
|
+
name: "stateRootIndex",
|
|
184
|
+
outputs: [{
|
|
185
|
+
name: "",
|
|
186
|
+
type: "uint256"
|
|
187
|
+
}],
|
|
188
|
+
stateMutability: "view",
|
|
189
|
+
type: "function"
|
|
190
|
+
}, {
|
|
191
|
+
inputs: [],
|
|
192
|
+
name: "underlying",
|
|
193
|
+
outputs: [{
|
|
194
|
+
name: "",
|
|
195
|
+
type: "address"
|
|
196
|
+
}],
|
|
197
|
+
stateMutability: "view",
|
|
198
|
+
type: "function"
|
|
199
|
+
}, {
|
|
200
|
+
inputs: [{
|
|
201
|
+
name: "amount",
|
|
202
|
+
type: "uint256"
|
|
203
|
+
}],
|
|
204
|
+
name: "deposit",
|
|
205
|
+
outputs: [],
|
|
206
|
+
stateMutability: "nonpayable",
|
|
207
|
+
type: "function"
|
|
208
|
+
}, {
|
|
209
|
+
inputs: [{
|
|
210
|
+
name: "to",
|
|
211
|
+
type: "address"
|
|
212
|
+
}, {
|
|
213
|
+
name: "amount",
|
|
214
|
+
type: "uint256"
|
|
215
|
+
}],
|
|
216
|
+
name: "transfer",
|
|
217
|
+
outputs: [{
|
|
218
|
+
name: "",
|
|
219
|
+
type: "bool"
|
|
220
|
+
}],
|
|
221
|
+
stateMutability: "nonpayable",
|
|
222
|
+
type: "function"
|
|
223
|
+
}, {
|
|
224
|
+
inputs: [{
|
|
225
|
+
name: "proof",
|
|
226
|
+
type: "uint256[8]"
|
|
227
|
+
}, {
|
|
228
|
+
name: "commitments",
|
|
229
|
+
type: "uint256[2]"
|
|
230
|
+
}, {
|
|
231
|
+
name: "commitmentPok",
|
|
232
|
+
type: "uint256[2]"
|
|
233
|
+
}, {
|
|
234
|
+
name: "lightClients",
|
|
235
|
+
type: "tuple[]",
|
|
236
|
+
components: [{
|
|
237
|
+
name: "clientId",
|
|
238
|
+
type: "uint32"
|
|
239
|
+
}, {
|
|
240
|
+
name: "height",
|
|
241
|
+
type: "uint64"
|
|
242
|
+
}]
|
|
243
|
+
}, {
|
|
244
|
+
name: "nullifier",
|
|
245
|
+
type: "uint256"
|
|
246
|
+
}, {
|
|
247
|
+
name: "value",
|
|
248
|
+
type: "uint256"
|
|
249
|
+
}, {
|
|
250
|
+
name: "beneficiary",
|
|
251
|
+
type: "address"
|
|
252
|
+
}, {
|
|
253
|
+
name: "attestedMessage",
|
|
254
|
+
type: "bytes32"
|
|
255
|
+
}, {
|
|
256
|
+
name: "signature",
|
|
257
|
+
type: "bytes"
|
|
258
|
+
}],
|
|
259
|
+
name: "redeem",
|
|
260
|
+
outputs: [],
|
|
261
|
+
stateMutability: "nonpayable",
|
|
262
|
+
type: "function"
|
|
263
|
+
}, {
|
|
264
|
+
anonymous: false,
|
|
265
|
+
inputs: [{
|
|
266
|
+
indexed: true,
|
|
267
|
+
name: "from",
|
|
268
|
+
type: "address"
|
|
269
|
+
}, {
|
|
270
|
+
indexed: true,
|
|
271
|
+
name: "to",
|
|
272
|
+
type: "address"
|
|
273
|
+
}, {
|
|
274
|
+
indexed: false,
|
|
275
|
+
name: "value",
|
|
276
|
+
type: "uint256"
|
|
277
|
+
}],
|
|
278
|
+
name: "Transfer",
|
|
279
|
+
type: "event"
|
|
280
|
+
}, {
|
|
281
|
+
anonymous: false,
|
|
282
|
+
inputs: [{
|
|
283
|
+
indexed: true,
|
|
284
|
+
name: "nullifier",
|
|
285
|
+
type: "uint256"
|
|
286
|
+
}, {
|
|
287
|
+
indexed: true,
|
|
288
|
+
name: "redeemAmount",
|
|
289
|
+
type: "uint256"
|
|
290
|
+
}, {
|
|
291
|
+
indexed: true,
|
|
292
|
+
name: "beneficiary",
|
|
293
|
+
type: "address"
|
|
294
|
+
}],
|
|
295
|
+
name: "Redeemed",
|
|
296
|
+
type: "event"
|
|
297
|
+
}];
|
|
298
|
+
const IBC_HANDLER_ABI = [{
|
|
299
|
+
inputs: [{
|
|
300
|
+
components: [{
|
|
301
|
+
name: "clientId",
|
|
302
|
+
type: "uint32"
|
|
303
|
+
}, {
|
|
304
|
+
name: "clientMessage",
|
|
305
|
+
type: "bytes"
|
|
306
|
+
}, {
|
|
307
|
+
name: "relayer",
|
|
308
|
+
type: "address"
|
|
309
|
+
}],
|
|
310
|
+
name: "msg_",
|
|
311
|
+
type: "tuple"
|
|
312
|
+
}],
|
|
313
|
+
name: "updateClient",
|
|
314
|
+
outputs: [],
|
|
315
|
+
stateMutability: "nonpayable",
|
|
316
|
+
type: "function"
|
|
317
|
+
}];
|
|
318
|
+
// @ts-expect-error
|
|
319
|
+
const MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
|
|
320
|
+
// @ts-expect-error
|
|
321
|
+
const MULTICALL3_ABI = [{
|
|
322
|
+
inputs: [{
|
|
323
|
+
name: "calls",
|
|
324
|
+
type: "tuple[]",
|
|
325
|
+
components: [{
|
|
326
|
+
name: "target",
|
|
327
|
+
type: "address"
|
|
328
|
+
}, {
|
|
329
|
+
name: "allowFailure",
|
|
330
|
+
type: "bool"
|
|
331
|
+
}, {
|
|
332
|
+
name: "callData",
|
|
333
|
+
type: "bytes"
|
|
334
|
+
}]
|
|
335
|
+
}],
|
|
336
|
+
name: "aggregate3",
|
|
337
|
+
outputs: [{
|
|
338
|
+
name: "returnData",
|
|
339
|
+
type: "tuple[]",
|
|
340
|
+
components: [{
|
|
341
|
+
name: "success",
|
|
342
|
+
type: "bool"
|
|
343
|
+
}, {
|
|
344
|
+
name: "returnData",
|
|
345
|
+
type: "bytes"
|
|
346
|
+
}]
|
|
347
|
+
}],
|
|
348
|
+
stateMutability: "payable",
|
|
349
|
+
type: "function"
|
|
350
|
+
}];
|
|
351
|
+
/**
|
|
352
|
+
* @public
|
|
353
|
+
*/
|
|
354
|
+
class RpcClient {
|
|
355
|
+
client;
|
|
356
|
+
constructor(rpcUrl) {
|
|
357
|
+
this.client = (0, _viem.createPublicClient)({
|
|
358
|
+
transport: (0, _viem.http)(rpcUrl)
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
getClient() {
|
|
362
|
+
return this.client;
|
|
363
|
+
}
|
|
364
|
+
async getChainId() {
|
|
365
|
+
return BigInt(await this.client.getChainId());
|
|
366
|
+
}
|
|
367
|
+
async getLatestBlockNumber() {
|
|
368
|
+
return this.client.getBlockNumber();
|
|
369
|
+
}
|
|
370
|
+
async getBalance(tokenAddress, accountAddress, blockNumber) {
|
|
371
|
+
return this.client.readContract({
|
|
372
|
+
address: tokenAddress,
|
|
373
|
+
abi: ERC20_ABI,
|
|
374
|
+
functionName: "balanceOf",
|
|
375
|
+
args: [accountAddress],
|
|
376
|
+
blockNumber
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
async getDecimals(tokenAddress) {
|
|
380
|
+
return this.client.readContract({
|
|
381
|
+
address: tokenAddress,
|
|
382
|
+
abi: ERC20_ABI,
|
|
383
|
+
functionName: "decimals"
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
async getSymbol(tokenAddress) {
|
|
387
|
+
return this.client.readContract({
|
|
388
|
+
address: tokenAddress,
|
|
389
|
+
abi: ERC20_ABI,
|
|
390
|
+
functionName: "symbol"
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
async getLightClientAddress(ibcStoreAddress, clientId) {
|
|
394
|
+
return this.client.readContract({
|
|
395
|
+
address: ibcStoreAddress,
|
|
396
|
+
abi: IBC_STORE_ABI,
|
|
397
|
+
functionName: "getClient",
|
|
398
|
+
args: [clientId]
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
async getLatestHeight(lightClientAddress, clientId) {
|
|
402
|
+
return this.client.readContract({
|
|
403
|
+
address: lightClientAddress,
|
|
404
|
+
abi: LIGHT_CLIENT_ABI,
|
|
405
|
+
functionName: "getLatestHeight",
|
|
406
|
+
args: [clientId]
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Get consensus state, extracting the state root at the given byte index
|
|
411
|
+
*/
|
|
412
|
+
async getConsensusState(lightClientAddress, clientId, height, stateRootIndex) {
|
|
413
|
+
const consensusBytes = await this.client.readContract({
|
|
414
|
+
address: lightClientAddress,
|
|
415
|
+
abi: LIGHT_CLIENT_ABI,
|
|
416
|
+
functionName: "getConsensusState",
|
|
417
|
+
args: [clientId, height]
|
|
418
|
+
});
|
|
419
|
+
const bytes = (0, _viem.hexToBytes)(consensusBytes);
|
|
420
|
+
const idx = Number(stateRootIndex);
|
|
421
|
+
const stateRoot = (0, _viem.bytesToHex)(bytes.slice(idx, idx + 32));
|
|
422
|
+
return {
|
|
423
|
+
stateRoot
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
async getNullifierBalance(zassetAddress, nullifier) {
|
|
427
|
+
return this.client.readContract({
|
|
428
|
+
address: zassetAddress,
|
|
429
|
+
abi: ZASSET_ABI,
|
|
430
|
+
functionName: "nullifierBalance",
|
|
431
|
+
args: [nullifier]
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
async getCounterparty(zassetAddress, clientId) {
|
|
435
|
+
const result = await this.client.readContract({
|
|
436
|
+
address: zassetAddress,
|
|
437
|
+
abi: ZASSET_ABI,
|
|
438
|
+
functionName: "counterparty",
|
|
439
|
+
args: [clientId]
|
|
440
|
+
});
|
|
441
|
+
return {
|
|
442
|
+
tokenAddressKey: result.tokenAddressKey,
|
|
443
|
+
balanceSlot: result.balanceSlot
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
async getIbcHandlerAddress(zassetAddress) {
|
|
447
|
+
return this.client.readContract({
|
|
448
|
+
address: zassetAddress,
|
|
449
|
+
abi: ZASSET_ABI,
|
|
450
|
+
functionName: "ibcHandler"
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
async getStateRootIndex(zassetAddress, clientId) {
|
|
454
|
+
return this.client.readContract({
|
|
455
|
+
address: zassetAddress,
|
|
456
|
+
abi: ZASSET_ABI,
|
|
457
|
+
functionName: "stateRootIndex",
|
|
458
|
+
args: [clientId]
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
async getProof(address, storageKeys, blockNumber) {
|
|
462
|
+
return this.client.getProof({
|
|
463
|
+
address,
|
|
464
|
+
storageKeys,
|
|
465
|
+
blockNumber
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
async getBlock(blockNumber) {
|
|
469
|
+
return this.client.getBlock({
|
|
470
|
+
blockNumber
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Get redemption history for a nullifier by querying Redeemed events
|
|
475
|
+
*/
|
|
476
|
+
async getRedemptionHistory(zassetAddress, nullifier, fromBlock, toBlock) {
|
|
477
|
+
const logs = await this.client.getLogs({
|
|
478
|
+
address: zassetAddress,
|
|
479
|
+
event: {
|
|
480
|
+
type: "event",
|
|
481
|
+
name: "Redeemed",
|
|
482
|
+
inputs: [{
|
|
483
|
+
indexed: true,
|
|
484
|
+
name: "nullifier",
|
|
485
|
+
type: "uint256"
|
|
486
|
+
}, {
|
|
487
|
+
indexed: true,
|
|
488
|
+
name: "redeemAmount",
|
|
489
|
+
type: "uint256"
|
|
490
|
+
}, {
|
|
491
|
+
indexed: true,
|
|
492
|
+
name: "beneficiary",
|
|
493
|
+
type: "address"
|
|
494
|
+
}]
|
|
495
|
+
},
|
|
496
|
+
args: {
|
|
497
|
+
nullifier
|
|
498
|
+
},
|
|
499
|
+
fromBlock: fromBlock ?? "earliest",
|
|
500
|
+
toBlock: toBlock ?? "latest"
|
|
501
|
+
});
|
|
502
|
+
return logs.map(log => ({
|
|
503
|
+
txHash: log.transactionHash,
|
|
504
|
+
blockNumber: log.blockNumber,
|
|
505
|
+
redeemAmount: log.args.redeemAmount,
|
|
506
|
+
beneficiary: log.args.beneficiary
|
|
507
|
+
}));
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Compute the storage slot for an ERC20 balance mapping: keccak256(abi.encode(address, slot))
|
|
512
|
+
* @public
|
|
513
|
+
*/
|
|
514
|
+
exports.RpcClient = RpcClient;
|
|
515
|
+
function computeStorageSlot(address, mappingSlot) {
|
|
516
|
+
const paddedAddress = (0, _viem.padHex)(address, {
|
|
517
|
+
size: 32
|
|
518
|
+
});
|
|
519
|
+
const paddedSlot = (0, _viem.padHex)((0, _viem.toHex)(mappingSlot), {
|
|
520
|
+
size: 32
|
|
521
|
+
});
|
|
522
|
+
return (0, _viem.keccak256)((0, _viem.encodePacked)(["bytes32", "bytes32"], [paddedAddress, paddedSlot]));
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* @public
|
|
526
|
+
*/
|
|
527
|
+
async function fetchLightClients(dstClient, zassetAddress, clientIds) {
|
|
528
|
+
const ibcHandlerAddress = await dstClient.getIbcHandlerAddress(zassetAddress);
|
|
529
|
+
const results = [];
|
|
530
|
+
for (const clientId of clientIds) {
|
|
531
|
+
try {
|
|
532
|
+
const lightClientAddress = await dstClient.getLightClientAddress(ibcHandlerAddress, clientId);
|
|
533
|
+
const height = await dstClient.getLatestHeight(lightClientAddress, clientId);
|
|
534
|
+
const stateRootIndex = await dstClient.getStateRootIndex(zassetAddress, clientId);
|
|
535
|
+
const {
|
|
536
|
+
stateRoot
|
|
537
|
+
} = await dstClient.getConsensusState(lightClientAddress, clientId, height, stateRootIndex);
|
|
538
|
+
results.push({
|
|
539
|
+
clientId,
|
|
540
|
+
height,
|
|
541
|
+
stateRoot
|
|
542
|
+
});
|
|
543
|
+
} catch {}
|
|
544
|
+
}
|
|
545
|
+
return results;
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* @public
|
|
549
|
+
*/
|
|
550
|
+
async function fetchMptProof(srcClient, tokenAddress, storageSlot, blockNumber) {
|
|
551
|
+
const proof = await srcClient.getProof(tokenAddress, [storageSlot], blockNumber);
|
|
552
|
+
let storageProof = [];
|
|
553
|
+
let storageValue = "0x0";
|
|
554
|
+
if (proof.storageProof.length > 0 && proof.storageProof[0]) {
|
|
555
|
+
storageProof = proof.storageProof[0].proof;
|
|
556
|
+
storageValue = (0, _viem.toHex)(proof.storageProof[0].value);
|
|
557
|
+
}
|
|
558
|
+
return {
|
|
559
|
+
accountProof: proof.accountProof,
|
|
560
|
+
storageProof,
|
|
561
|
+
storageValue,
|
|
562
|
+
storageRoot: proof.storageHash
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Deterministically shuffle light clients using the secret as seed.
|
|
567
|
+
* Same secret always produces the same ordering for privacy.
|
|
568
|
+
* @public
|
|
569
|
+
*/
|
|
570
|
+
function deterministicShuffleClients(clients, secret) {
|
|
571
|
+
if (clients.length <= 1) {
|
|
572
|
+
return [...clients];
|
|
573
|
+
}
|
|
574
|
+
// Seed = SHA256(secret || clientHeights as big-endian uint64s)
|
|
575
|
+
const secretBytes = (0, _viem.hexToBytes)(secret);
|
|
576
|
+
const heightsBytes = new Uint8Array(clients.length * 8);
|
|
577
|
+
for (let i = 0; i < clients.length; i++) {
|
|
578
|
+
const view = new DataView(heightsBytes.buffer, i * 8, 8);
|
|
579
|
+
view.setBigUint64(0, clients[i].height, false);
|
|
580
|
+
}
|
|
581
|
+
const combined = new Uint8Array(secretBytes.length + heightsBytes.length);
|
|
582
|
+
combined.set(secretBytes, 0);
|
|
583
|
+
combined.set(heightsBytes, secretBytes.length);
|
|
584
|
+
const seedHex = (0, _viem.sha256)(combined);
|
|
585
|
+
const seed = (0, _viem.hexToBytes)(seedHex);
|
|
586
|
+
// Fisher-Yates shuffle with deterministic PRNG
|
|
587
|
+
const shuffled = [...clients];
|
|
588
|
+
let seedIndex = 0;
|
|
589
|
+
for (let i = shuffled.length - 1; i > 0; i--) {
|
|
590
|
+
const randomByte = seed[seedIndex % seed.length];
|
|
591
|
+
seedIndex++;
|
|
592
|
+
const j = randomByte % (i + 1);
|
|
593
|
+
[shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
|
|
594
|
+
}
|
|
595
|
+
return shuffled;
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* Sign an attested message with raw ECDSA (no EIP-191 prefix).
|
|
599
|
+
* Matches Go CLI's crypto.Sign behavior for SignatureCheckerLib verification.
|
|
600
|
+
* @public
|
|
601
|
+
*/
|
|
602
|
+
async function signAttestedMessage(message, privateKey) {
|
|
603
|
+
const messageBytes = (0, _viem.hexToBytes)(message);
|
|
604
|
+
if (messageBytes.length !== 32) {
|
|
605
|
+
throw new Error(`Invalid message length: expected 32 bytes, got ${messageBytes.length}`);
|
|
606
|
+
}
|
|
607
|
+
const signature = await (0, _accounts.sign)({
|
|
608
|
+
hash: message,
|
|
609
|
+
privateKey,
|
|
610
|
+
to: "hex"
|
|
611
|
+
});
|
|
612
|
+
return signature;
|
|
613
|
+
}
|
|
614
|
+
/**
|
|
615
|
+
* @public
|
|
616
|
+
*/
|
|
617
|
+
function parseProofJson(proofJsonBytes) {
|
|
618
|
+
const jsonStr = new TextDecoder().decode(proofJsonBytes);
|
|
619
|
+
const raw = JSON.parse(jsonStr);
|
|
620
|
+
const commitments = raw.commitments ?? ["0x0", "0x0"];
|
|
621
|
+
return {
|
|
622
|
+
proof: raw.proof,
|
|
623
|
+
commitments: commitments,
|
|
624
|
+
commitmentPok: raw.commitmentPok,
|
|
625
|
+
publicInputs: raw.publicInputs ?? []
|
|
626
|
+
};
|
|
627
|
+
}
|
|
628
|
+
/**
|
|
629
|
+
* @public
|
|
630
|
+
*/
|
|
631
|
+
function proofJsonToRedeemParams(proofJson, metadata) {
|
|
632
|
+
const parseBigInt = s => {
|
|
633
|
+
if (s.startsWith("0x")) {
|
|
634
|
+
return (0, _viem.hexToBigInt)(s);
|
|
635
|
+
}
|
|
636
|
+
return BigInt(s);
|
|
637
|
+
};
|
|
638
|
+
return {
|
|
639
|
+
proof: proofJson.proof.map(parseBigInt),
|
|
640
|
+
commitments: proofJson.commitments.map(parseBigInt),
|
|
641
|
+
commitmentPok: proofJson.commitmentPok.map(parseBigInt),
|
|
642
|
+
lightClients: metadata.lightClients.map(lc => ({
|
|
643
|
+
clientId: lc.clientId,
|
|
644
|
+
height: lc.height
|
|
645
|
+
})),
|
|
646
|
+
nullifier: metadata.nullifier,
|
|
647
|
+
value: metadata.value,
|
|
648
|
+
beneficiary: metadata.beneficiary,
|
|
649
|
+
attestedMessage: metadata.attestedMessage,
|
|
650
|
+
signature: metadata.signature
|
|
651
|
+
};
|
|
652
|
+
}
|
|
653
|
+
/**
|
|
654
|
+
* @public
|
|
655
|
+
*/
|
|
656
|
+
async function submitRedeem(zassetAddress, params, walletClient) {
|
|
657
|
+
if (!walletClient.account) {
|
|
658
|
+
throw new Error("WalletClient must have an account");
|
|
659
|
+
}
|
|
660
|
+
if (!walletClient.chain) {
|
|
661
|
+
throw new Error("WalletClient must have a chain configured");
|
|
662
|
+
}
|
|
663
|
+
const hash = await walletClient.writeContractSync({
|
|
664
|
+
address: zassetAddress,
|
|
665
|
+
abi: ZASSET_ABI,
|
|
666
|
+
functionName: "redeem",
|
|
667
|
+
args: [params.proof, params.commitments, params.commitmentPok, params.lightClients, params.nullifier, params.value, params.beneficiary, params.attestedMessage, params.signature],
|
|
668
|
+
chain: walletClient.chain,
|
|
669
|
+
account: walletClient.account
|
|
670
|
+
}).then(x => x.transactionHash);
|
|
671
|
+
return hash;
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* RLP encode an EVM block header for the loopback light client.
|
|
675
|
+
* The header fields must be in the exact order expected by the EVM.
|
|
676
|
+
* Verifies the encoding by checking that keccak256(rlp) == block.hash
|
|
677
|
+
*/
|
|
678
|
+
function rlpEncodeBlockHeader(block) {
|
|
679
|
+
// Helper to convert bigint/number to minimal RLP hex encoding
|
|
680
|
+
// RLP requires no leading zeros, and 0 is encoded as empty string (0x80)
|
|
681
|
+
const toRlpHex = value => {
|
|
682
|
+
if (value === undefined || value === null || value === 0n || value === 0) {
|
|
683
|
+
return "0x";
|
|
684
|
+
}
|
|
685
|
+
let hex = typeof value === "bigint" ? value.toString(16) : value.toString(16);
|
|
686
|
+
// Ensure even length for proper byte encoding
|
|
687
|
+
if (hex.length % 2 !== 0) {
|
|
688
|
+
hex = "0" + hex;
|
|
689
|
+
}
|
|
690
|
+
return `0x${hex}`;
|
|
691
|
+
};
|
|
692
|
+
// Build header fields in order (pre-merge + post-merge fields)
|
|
693
|
+
const headerFields = [block.parentHash, block.sha3Uncles, block.miner, block.stateRoot, block.transactionsRoot, block.receiptsRoot, block.logsBloom ?? "0x" + "00".repeat(256), toRlpHex(block.difficulty), toRlpHex(block.number), toRlpHex(block.gasLimit), toRlpHex(block.gasUsed), toRlpHex(block.timestamp), block.extraData, block.mixHash ?? "0x0000000000000000000000000000000000000000000000000000000000000000", block.nonce ?? "0x0000000000000000"];
|
|
694
|
+
// Post-merge fields (EIP-1559, EIP-4895, EIP-4844, EIP-4788, EIP-7685)
|
|
695
|
+
if (block.baseFeePerGas !== undefined && block.baseFeePerGas !== null) {
|
|
696
|
+
headerFields.push(toRlpHex(block.baseFeePerGas));
|
|
697
|
+
}
|
|
698
|
+
if (block.withdrawalsRoot) {
|
|
699
|
+
headerFields.push(block.withdrawalsRoot);
|
|
700
|
+
}
|
|
701
|
+
if (block.blobGasUsed !== undefined && block.blobGasUsed !== null) {
|
|
702
|
+
headerFields.push(toRlpHex(block.blobGasUsed));
|
|
703
|
+
}
|
|
704
|
+
if (block.excessBlobGas !== undefined && block.excessBlobGas !== null) {
|
|
705
|
+
headerFields.push(toRlpHex(block.excessBlobGas));
|
|
706
|
+
}
|
|
707
|
+
if (block.parentBeaconBlockRoot) {
|
|
708
|
+
headerFields.push(block.parentBeaconBlockRoot);
|
|
709
|
+
}
|
|
710
|
+
// EIP-7685 requestsHash (Pectra upgrade) - not yet in viem types
|
|
711
|
+
const blockAny = block;
|
|
712
|
+
if (blockAny.requestsHash) {
|
|
713
|
+
headerFields.push(blockAny.requestsHash);
|
|
714
|
+
}
|
|
715
|
+
const rlpEncoded = (0, _viem.toRlp)(headerFields);
|
|
716
|
+
// Verify the encoding produces the correct block hash
|
|
717
|
+
const computedHash = (0, _viem.keccak256)(rlpEncoded);
|
|
718
|
+
if (computedHash !== block.hash) {
|
|
719
|
+
throw new Error(`RLP encoding mismatch: computed hash ${computedHash} does not match block hash ${block.hash}. ` + `Block number: ${block.number}, fields count: ${headerFields.length}`);
|
|
720
|
+
}
|
|
721
|
+
return rlpEncoded;
|
|
722
|
+
}
|
|
723
|
+
/**
|
|
724
|
+
* Update a loopback light client to a specific block height.
|
|
725
|
+
* The loopback client operates on the same chain, so only one RPC URL is needed.
|
|
726
|
+
*
|
|
727
|
+
* @param rpcUrl - RPC URL for the chain (same chain for fetching block and submitting tx)
|
|
728
|
+
* @param ibcHandlerAddress - Address of the IBCHandler contract
|
|
729
|
+
* @param clientId - The light client ID to update
|
|
730
|
+
* @param height - Block height to update to (bigint or 'latest')
|
|
731
|
+
* @param walletClient - viem WalletClient with account and chain configured
|
|
732
|
+
* @returns Transaction hash, block number, state root, and chain ID
|
|
733
|
+
* @public
|
|
734
|
+
*/
|
|
735
|
+
async function updateLoopbackClient(rpcUrl, ibcHandlerAddress, clientId, height, walletClient) {
|
|
736
|
+
if (!walletClient.account) {
|
|
737
|
+
throw new Error("WalletClient must have an account");
|
|
738
|
+
}
|
|
739
|
+
if (!walletClient.chain) {
|
|
740
|
+
throw new Error("WalletClient must have a chain configured");
|
|
741
|
+
}
|
|
742
|
+
// Create public client
|
|
743
|
+
const publicClient = (0, _viem.createPublicClient)({
|
|
744
|
+
transport: (0, _viem.http)(rpcUrl)
|
|
745
|
+
});
|
|
746
|
+
// Get chain ID from RPC
|
|
747
|
+
const chainId = await publicClient.getChainId();
|
|
748
|
+
// Get the block number
|
|
749
|
+
const blockNumber = height === "latest" ? await publicClient.getBlockNumber() : height;
|
|
750
|
+
// Get the block for metadata
|
|
751
|
+
const block = await publicClient.getBlock({
|
|
752
|
+
blockNumber
|
|
753
|
+
});
|
|
754
|
+
if (!block.number) {
|
|
755
|
+
throw new Error("Block number is null");
|
|
756
|
+
}
|
|
757
|
+
// RLP encode the block header and verify the hash matches
|
|
758
|
+
const rlpEncodedHeader = rlpEncodeBlockHeader(block);
|
|
759
|
+
// Encode the Header struct: (uint64 height, bytes encodedHeader)
|
|
760
|
+
const clientMessage = (0, _viem.encodeAbiParameters)([{
|
|
761
|
+
type: "uint64",
|
|
762
|
+
name: "height"
|
|
763
|
+
}, {
|
|
764
|
+
type: "bytes",
|
|
765
|
+
name: "encodedHeader"
|
|
766
|
+
}], [block.number, rlpEncodedHeader]);
|
|
767
|
+
// Wait for the next block so the fetched block's hash is verifiable on-chain
|
|
768
|
+
let currentBlock = await publicClient.getBlockNumber();
|
|
769
|
+
while (currentBlock <= blockNumber) {
|
|
770
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
771
|
+
currentBlock = await publicClient.getBlockNumber();
|
|
772
|
+
}
|
|
773
|
+
// Submit the transaction
|
|
774
|
+
const txHash = await walletClient.writeContractSync({
|
|
775
|
+
address: ibcHandlerAddress,
|
|
776
|
+
abi: IBC_HANDLER_ABI,
|
|
777
|
+
functionName: "updateClient",
|
|
778
|
+
args: [{
|
|
779
|
+
clientId,
|
|
780
|
+
clientMessage,
|
|
781
|
+
relayer: walletClient.account.address
|
|
782
|
+
}],
|
|
783
|
+
chain: walletClient.chain,
|
|
784
|
+
account: walletClient.account
|
|
785
|
+
}).then(x => x.transactionHash);
|
|
786
|
+
return {
|
|
787
|
+
txHash,
|
|
788
|
+
blockNumber: block.number,
|
|
789
|
+
stateRoot: block.stateRoot,
|
|
790
|
+
chainId: BigInt(chainId)
|
|
791
|
+
};
|
|
792
|
+
}
|
|
793
|
+
/**
|
|
794
|
+
* Deposit underlying tokens to ZAsset and transfer to a deposit address.
|
|
795
|
+
* Executes 3 transactions: approve → deposit → transfer.
|
|
796
|
+
*
|
|
797
|
+
* @param rpcUrl - RPC URL for the chain
|
|
798
|
+
* @param zAssetAddress - Address of the ZAsset contract
|
|
799
|
+
* @param depositAddress - Address to receive the ZAsset tokens (derived from secret)
|
|
800
|
+
* @param amount - Amount to deposit (in underlying token's smallest unit)
|
|
801
|
+
* @param walletClient - viem WalletClient with account and chain configured
|
|
802
|
+
* @returns Transaction hash of the final transfer, underlying token address, and chain ID
|
|
803
|
+
* @public
|
|
804
|
+
*/
|
|
805
|
+
async function depositToZAsset(rpcUrl, zAssetAddress, depositAddress, amount, walletClient) {
|
|
806
|
+
if (!walletClient.account) {
|
|
807
|
+
throw new Error("WalletClient must have an account");
|
|
808
|
+
}
|
|
809
|
+
if (!walletClient.chain) {
|
|
810
|
+
throw new Error("WalletClient must have a chain configured");
|
|
811
|
+
}
|
|
812
|
+
const publicClient = (0, _viem.createPublicClient)({
|
|
813
|
+
transport: (0, _viem.http)(rpcUrl)
|
|
814
|
+
});
|
|
815
|
+
const chainId = await publicClient.getChainId();
|
|
816
|
+
// Get underlying token address
|
|
817
|
+
const underlyingToken = await publicClient.readContract({
|
|
818
|
+
address: zAssetAddress,
|
|
819
|
+
abi: ZASSET_ABI,
|
|
820
|
+
functionName: "underlying"
|
|
821
|
+
});
|
|
822
|
+
if (underlyingToken === "0x0000000000000000000000000000000000000000") {
|
|
823
|
+
throw new Error("ZAsset is not a wrapped token (underlying is zero address)");
|
|
824
|
+
}
|
|
825
|
+
// 1. Approve ZAsset to spend underlying tokens
|
|
826
|
+
const approveReceipt = await walletClient.writeContractSync({
|
|
827
|
+
address: underlyingToken,
|
|
828
|
+
abi: ERC20_ABI,
|
|
829
|
+
functionName: "approve",
|
|
830
|
+
args: [zAssetAddress, amount],
|
|
831
|
+
chain: walletClient.chain,
|
|
832
|
+
account: walletClient.account
|
|
833
|
+
});
|
|
834
|
+
if (approveReceipt.status === "reverted") {
|
|
835
|
+
throw new Error(`Approve transaction reverted: ${approveReceipt.transactionHash}`);
|
|
836
|
+
}
|
|
837
|
+
// 2. Deposit underlying to get ZAsset
|
|
838
|
+
const depositReceipt = await walletClient.writeContractSync({
|
|
839
|
+
address: zAssetAddress,
|
|
840
|
+
abi: ZASSET_ABI,
|
|
841
|
+
functionName: "deposit",
|
|
842
|
+
args: [amount],
|
|
843
|
+
chain: walletClient.chain,
|
|
844
|
+
account: walletClient.account
|
|
845
|
+
});
|
|
846
|
+
if (depositReceipt.status === "reverted") {
|
|
847
|
+
throw new Error(`Deposit transaction reverted: ${depositReceipt.transactionHash}`);
|
|
848
|
+
}
|
|
849
|
+
// 3. Transfer ZAsset to deposit address
|
|
850
|
+
const transferReceipt = await walletClient.writeContractSync({
|
|
851
|
+
address: zAssetAddress,
|
|
852
|
+
abi: ZASSET_ABI,
|
|
853
|
+
functionName: "transfer",
|
|
854
|
+
args: [depositAddress, amount],
|
|
855
|
+
chain: walletClient.chain,
|
|
856
|
+
account: walletClient.account
|
|
857
|
+
});
|
|
858
|
+
if (transferReceipt.status === "reverted") {
|
|
859
|
+
throw new Error(`Transfer transaction reverted: ${transferReceipt.transactionHash}`);
|
|
860
|
+
}
|
|
861
|
+
return {
|
|
862
|
+
txHash: transferReceipt.transactionHash,
|
|
863
|
+
underlyingToken,
|
|
864
|
+
chainId: BigInt(chainId)
|
|
865
|
+
};
|
|
866
|
+
}
|
|
867
|
+
//# sourceMappingURL=rpc.js.map
|