@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/src/Payment.ts
ADDED
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* - for deposits you only need to sign on the source chain
|
|
3
|
+
* - for redemptions you need wallet on dest chain
|
|
4
|
+
*/
|
|
5
|
+
import { Effect, pipe } from "effect";
|
|
6
|
+
import * as A from "effect/Array";
|
|
7
|
+
import {
|
|
8
|
+
type Address,
|
|
9
|
+
encodePacked,
|
|
10
|
+
hexToBigInt,
|
|
11
|
+
hexToBytes,
|
|
12
|
+
keccak256,
|
|
13
|
+
padHex,
|
|
14
|
+
sha256,
|
|
15
|
+
toHex,
|
|
16
|
+
} from "viem";
|
|
17
|
+
import * as Attestor from "./Attestor.js";
|
|
18
|
+
import * as Constants from "./Constants.js";
|
|
19
|
+
import * as ZAssetRegistry from "./constants/z-asset-registry.js";
|
|
20
|
+
import type { Erc20Address } from "./Domain.js";
|
|
21
|
+
import * as Domain from "./Domain.js";
|
|
22
|
+
import * as Error from "./Error.js";
|
|
23
|
+
import * as Prover from "./Prover.js";
|
|
24
|
+
import * as PublicClient from "./PublicClient.js";
|
|
25
|
+
import * as Poseidon2 from "./poseidon2.js";
|
|
26
|
+
import type * as PS from "./Schema.js";
|
|
27
|
+
import type { LightClientData } from "./types.js";
|
|
28
|
+
import * as Utils from "./Utils.js";
|
|
29
|
+
import * as WalletClient from "./WalletClient.js";
|
|
30
|
+
|
|
31
|
+
// TODO: into poseidon2 module
|
|
32
|
+
const PRIME =
|
|
33
|
+
0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001n; // BN254 Fr order
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @public
|
|
37
|
+
*/
|
|
38
|
+
export interface DepositOptions {
|
|
39
|
+
/** The 32-byte secret payment key as a hex string */
|
|
40
|
+
readonly paymentKey: PS.Hex;
|
|
41
|
+
/** Array of 0-4 beneficiary addresses*/
|
|
42
|
+
readonly beneficiaries: ReadonlyArray<Address>;
|
|
43
|
+
/** Amount to deposit (in underlying token's smallest unit) */
|
|
44
|
+
readonly amount: bigint;
|
|
45
|
+
readonly destinationChainId: bigint;
|
|
46
|
+
readonly sourceChainId: bigint;
|
|
47
|
+
readonly srcErc20Address: Domain.Erc20Address;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @public
|
|
52
|
+
*/
|
|
53
|
+
export interface RedeemOptions {
|
|
54
|
+
/** The 32-byte secret payment key as a hex string */
|
|
55
|
+
paymentKey: PS.Hex;
|
|
56
|
+
/** Array of 0-4 beneficiary addresses */
|
|
57
|
+
beneficiaries: Address[];
|
|
58
|
+
/** The beneficiary address to redeem to */
|
|
59
|
+
beneficiary: Address;
|
|
60
|
+
/** Amount to redeem */
|
|
61
|
+
amount: bigint;
|
|
62
|
+
/** Light client IDs to include in the proof (for anonymity set) */
|
|
63
|
+
clientIds: number[];
|
|
64
|
+
/** The specific light client ID to use for the proof */
|
|
65
|
+
selectedClientId: number;
|
|
66
|
+
/** Auto unwrap */
|
|
67
|
+
unwrap?: boolean | undefined;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export const getDepositAddress = Effect.fn("getDepositAddress")(
|
|
71
|
+
(
|
|
72
|
+
secret: PS.Hex,
|
|
73
|
+
beneficiaries: ReadonlyArray<PS.Address>,
|
|
74
|
+
destinationChainId: bigint,
|
|
75
|
+
) =>
|
|
76
|
+
Effect.gen(function* () {
|
|
77
|
+
const paddedBeneficiaries = yield* padBeneficiaries(beneficiaries);
|
|
78
|
+
const unspendableAddress = Poseidon2.computeUnspendableAddress(
|
|
79
|
+
secret,
|
|
80
|
+
destinationChainId,
|
|
81
|
+
paddedBeneficiaries,
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
return Domain.ZAssetAddress(unspendableAddress);
|
|
85
|
+
}),
|
|
86
|
+
);
|
|
87
|
+
const padBeneficiaries = Effect.fn("padBeneficiaries")(
|
|
88
|
+
(beneficiaries: ReadonlyArray<PS.Address>) =>
|
|
89
|
+
Effect.gen(function* () {
|
|
90
|
+
if (beneficiaries.length > 4) {
|
|
91
|
+
// throw new Error("Maximum 4 beneficiaries allowed");
|
|
92
|
+
return yield* new Error.SystemError({
|
|
93
|
+
method: "padBeneficiaries",
|
|
94
|
+
module: "PaymentClient",
|
|
95
|
+
reason: "InvalidData",
|
|
96
|
+
description: "Maximum 4 beneficiaries allowed",
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
const padded: [PS.Address, PS.Address, PS.Address, PS.Address] = [
|
|
100
|
+
beneficiaries[0] ?? Constants.ZERO_ADDRESS,
|
|
101
|
+
beneficiaries[1] ?? Constants.ZERO_ADDRESS,
|
|
102
|
+
beneficiaries[2] ?? Constants.ZERO_ADDRESS,
|
|
103
|
+
beneficiaries[3] ?? Constants.ZERO_ADDRESS,
|
|
104
|
+
];
|
|
105
|
+
return padded;
|
|
106
|
+
}),
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
export const getNullifier = Effect.fn("getNullifier")(
|
|
110
|
+
(secret: PS.Hex, destinationChainId: bigint) =>
|
|
111
|
+
Effect.try({
|
|
112
|
+
try: () => Poseidon2.computeNullifier(secret, destinationChainId),
|
|
113
|
+
catch: (cause) =>
|
|
114
|
+
new Error.SystemError({
|
|
115
|
+
method: "getNullifier",
|
|
116
|
+
module: "PaymentClient",
|
|
117
|
+
reason: "InvalidData",
|
|
118
|
+
cause,
|
|
119
|
+
}),
|
|
120
|
+
}),
|
|
121
|
+
);
|
|
122
|
+
/**
|
|
123
|
+
* Deterministically shuffle light clients using the secret as seed.
|
|
124
|
+
* Same secret always produces the same ordering for privacy.
|
|
125
|
+
* @public
|
|
126
|
+
*/
|
|
127
|
+
export function deterministicShuffleClients(
|
|
128
|
+
clients: LightClientData[],
|
|
129
|
+
secret: PS.Hex,
|
|
130
|
+
): LightClientData[] {
|
|
131
|
+
if (clients.length <= 1) {
|
|
132
|
+
return [...clients];
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Seed = SHA256(secret || clientHeights as big-endian uint64s)
|
|
136
|
+
const secretBytes = hexToBytes(secret);
|
|
137
|
+
const heightsBytes = new Uint8Array(clients.length * 8);
|
|
138
|
+
for (let i = 0; i < clients.length; i++) {
|
|
139
|
+
const view = new DataView(heightsBytes.buffer, i * 8, 8);
|
|
140
|
+
view.setBigUint64(0, clients[i]!.height, false);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const combined = new Uint8Array(secretBytes.length + heightsBytes.length);
|
|
144
|
+
combined.set(secretBytes, 0);
|
|
145
|
+
combined.set(heightsBytes, secretBytes.length);
|
|
146
|
+
const seedHex = sha256(combined);
|
|
147
|
+
const seed = hexToBytes(seedHex);
|
|
148
|
+
|
|
149
|
+
// Fisher-Yates shuffle with deterministic PRNG
|
|
150
|
+
const shuffled = [...clients];
|
|
151
|
+
let seedIndex = 0;
|
|
152
|
+
for (let i = shuffled.length - 1; i > 0; i--) {
|
|
153
|
+
const randomByte = seed[seedIndex % seed.length]!;
|
|
154
|
+
seedIndex++;
|
|
155
|
+
const j = randomByte % (i + 1);
|
|
156
|
+
[shuffled[i], shuffled[j]] = [shuffled[j]!, shuffled[i]!];
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return shuffled;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export const computeStorageSlot = Effect.fn("computeStorageSlot")(function* (
|
|
163
|
+
address: Address,
|
|
164
|
+
mappingSlot: bigint,
|
|
165
|
+
) {
|
|
166
|
+
const paddedAddress = padHex(address, { size: 32 });
|
|
167
|
+
const paddedSlot = padHex(toHex(mappingSlot), { size: 32 });
|
|
168
|
+
return yield* Effect.succeed(
|
|
169
|
+
keccak256(
|
|
170
|
+
encodePacked(["bytes32", "bytes32"], [paddedAddress, paddedSlot]),
|
|
171
|
+
),
|
|
172
|
+
);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
const fetchMptProof = Effect.fn(function* (options: {
|
|
176
|
+
tokenAddress: `0x${string}`;
|
|
177
|
+
storageSlot: `0x${string}`;
|
|
178
|
+
blockNumber: bigint;
|
|
179
|
+
}) {
|
|
180
|
+
yield* Effect.log(options);
|
|
181
|
+
|
|
182
|
+
const srcClient = yield* PublicClient.SourcePublicClient;
|
|
183
|
+
const proof = yield* srcClient.getProof({
|
|
184
|
+
address: options.tokenAddress,
|
|
185
|
+
storageKeys: [options.storageSlot],
|
|
186
|
+
blockNumber: options.blockNumber,
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
let storageProof: `0x${string}`[] = [];
|
|
190
|
+
let storageValue: `0x${string}` = "0x0";
|
|
191
|
+
|
|
192
|
+
if (proof.storageProof.length > 0 && proof.storageProof[0]) {
|
|
193
|
+
storageProof = proof.storageProof[0].proof as `0x${string}`[];
|
|
194
|
+
storageValue = toHex(proof.storageProof[0].value);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const obj = {
|
|
198
|
+
accountProof: proof.accountProof,
|
|
199
|
+
storageProof,
|
|
200
|
+
storageValue,
|
|
201
|
+
storageRoot: proof.storageHash,
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
yield* Effect.log("[fetchMptProof]", obj);
|
|
205
|
+
|
|
206
|
+
return obj;
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
export const generateProof = Effect.fn(function* (options: {
|
|
210
|
+
secret: PS.Hex;
|
|
211
|
+
beneficiaries: Address[];
|
|
212
|
+
beneficiary: Address;
|
|
213
|
+
amount: bigint;
|
|
214
|
+
clientIds: number[];
|
|
215
|
+
selectedClientId: number;
|
|
216
|
+
srcChainId: bigint;
|
|
217
|
+
dstChainId: bigint;
|
|
218
|
+
srcErc20Address: Erc20Address;
|
|
219
|
+
dstErc20Address: Erc20Address;
|
|
220
|
+
}) {
|
|
221
|
+
if (!options.clientIds.includes(options.selectedClientId)) {
|
|
222
|
+
return yield* Effect.fail({
|
|
223
|
+
proof: {
|
|
224
|
+
success: false,
|
|
225
|
+
error: `selectedClientId ${options.selectedClientId} not in clientIds`,
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (options.beneficiary === Constants.ZERO_ADDRESS) {
|
|
231
|
+
return yield* Effect.fail({
|
|
232
|
+
proof: {
|
|
233
|
+
success: false,
|
|
234
|
+
error: "Beneficiary address cannot be zero",
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const srcZAssetAddress = yield* ZAssetRegistry.getZAssetOrError(
|
|
240
|
+
options.srcChainId,
|
|
241
|
+
options.srcErc20Address,
|
|
242
|
+
);
|
|
243
|
+
const dstZAssetAddress = yield* ZAssetRegistry.getZAssetOrError(
|
|
244
|
+
options.dstChainId,
|
|
245
|
+
options.dstErc20Address,
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
const prover = yield* Prover.Prover;
|
|
249
|
+
const destinationPublicClient = yield* PublicClient.DestinationPublicClient;
|
|
250
|
+
const paddedBeneficiaries = yield* padBeneficiaries(options.beneficiaries);
|
|
251
|
+
const depositAddress = yield* getDepositAddress(
|
|
252
|
+
options.secret,
|
|
253
|
+
options.beneficiaries,
|
|
254
|
+
options.dstChainId,
|
|
255
|
+
);
|
|
256
|
+
const lightClients = yield* fetchLightClients({
|
|
257
|
+
zAssetAddress: dstZAssetAddress,
|
|
258
|
+
clientIds: options.clientIds,
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
if (!A.isNonEmptyReadonlyArray(lightClients)) {
|
|
262
|
+
return yield* new Error.SystemError({
|
|
263
|
+
module: "PaymentClient",
|
|
264
|
+
method: "generateProof",
|
|
265
|
+
reason: "InvalidData",
|
|
266
|
+
description: "No valid light clients found",
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Deterministic shuffle: same secret always produces the same ordering for privacy
|
|
271
|
+
const shuffled = deterministicShuffleClients(lightClients, options.secret);
|
|
272
|
+
const selectedClientIndex = yield* pipe(
|
|
273
|
+
A.findFirstIndex(shuffled, (c) => c.clientId === options.selectedClientId),
|
|
274
|
+
Effect.mapError(
|
|
275
|
+
(cause) =>
|
|
276
|
+
new Error.SystemError({
|
|
277
|
+
module: "PaymentClient",
|
|
278
|
+
method: "generateProof",
|
|
279
|
+
reason: "InvalidData",
|
|
280
|
+
cause,
|
|
281
|
+
description: `Client not found after fetching`,
|
|
282
|
+
}),
|
|
283
|
+
),
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
const selectedClient = A.unsafeGet(shuffled, selectedClientIndex);
|
|
287
|
+
|
|
288
|
+
const { tokenAddressKey, balanceSlot } =
|
|
289
|
+
yield* destinationPublicClient.getCounterparty(
|
|
290
|
+
dstZAssetAddress,
|
|
291
|
+
options.selectedClientId,
|
|
292
|
+
);
|
|
293
|
+
|
|
294
|
+
// Check if counterparty is configured for this light client
|
|
295
|
+
const ZERO_BYTES32 =
|
|
296
|
+
"0x0000000000000000000000000000000000000000000000000000000000000000";
|
|
297
|
+
|
|
298
|
+
yield* Effect.log({ balanceSlot });
|
|
299
|
+
|
|
300
|
+
if (balanceSlot === ZERO_BYTES32 || tokenAddressKey === ZERO_BYTES32) {
|
|
301
|
+
return yield* new Error.SystemError({
|
|
302
|
+
module: "PaymentClient",
|
|
303
|
+
method: "generateProof",
|
|
304
|
+
reason: "InvalidData",
|
|
305
|
+
description:
|
|
306
|
+
`Light client is not configured as a counterparty on the destination ZAsset. ` +
|
|
307
|
+
`Please call setCounterparty() on the ZAsset contract first.`,
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const mappingSlot = hexToBigInt(balanceSlot);
|
|
312
|
+
|
|
313
|
+
yield* Effect.log({ mappingSlot });
|
|
314
|
+
|
|
315
|
+
const nullifier = yield* getNullifier(options.secret, options.dstChainId);
|
|
316
|
+
|
|
317
|
+
// Check balance at the selected light client's height
|
|
318
|
+
const balance = yield* destinationPublicClient.readBalanceAtHeight({
|
|
319
|
+
srcErc20Address: options.srcErc20Address,
|
|
320
|
+
dstErc20Address: options.dstErc20Address,
|
|
321
|
+
srcChainId: options.srcChainId,
|
|
322
|
+
dstChainId: options.dstChainId,
|
|
323
|
+
depositAddress,
|
|
324
|
+
nullifier,
|
|
325
|
+
height: selectedClient.height,
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
if (options.amount > balance.available) {
|
|
329
|
+
return yield* new Error.SystemError({
|
|
330
|
+
module: "PaymentClient",
|
|
331
|
+
method: "generateProof",
|
|
332
|
+
reason: "InvalidData",
|
|
333
|
+
description:
|
|
334
|
+
`Insufficient available balance. Requested: ${options.amount}, Available: ${balance.available} ` +
|
|
335
|
+
`(Confirmed at height ${selectedClient.height}: ${balance.confirmed}, Already redeemed: ${balance.redeemed})`,
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
const storageSlot = yield* computeStorageSlot(depositAddress, mappingSlot);
|
|
340
|
+
|
|
341
|
+
const mptProof = yield* fetchMptProof({
|
|
342
|
+
tokenAddress: srcZAssetAddress,
|
|
343
|
+
storageSlot,
|
|
344
|
+
blockNumber: selectedClient.height,
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
const witness: Prover.WitnessData = {
|
|
348
|
+
secret: options.secret,
|
|
349
|
+
dstChainId: options.dstChainId,
|
|
350
|
+
beneficiaries: paddedBeneficiaries,
|
|
351
|
+
beneficiary: options.beneficiary,
|
|
352
|
+
redeemAmount: options.amount,
|
|
353
|
+
alreadyRedeemed: balance.redeemed,
|
|
354
|
+
lightClients: shuffled,
|
|
355
|
+
selectedClientIndex,
|
|
356
|
+
mptProof,
|
|
357
|
+
srcZAssetAddress: srcZAssetAddress,
|
|
358
|
+
mappingSlot: `0x${mappingSlot.toString(16)}` as `0x${string}`,
|
|
359
|
+
};
|
|
360
|
+
|
|
361
|
+
const proofResult = yield* prover.generateProof(witness);
|
|
362
|
+
|
|
363
|
+
yield* Effect.log({ proofResult });
|
|
364
|
+
|
|
365
|
+
return {
|
|
366
|
+
proof: proofResult,
|
|
367
|
+
metadata: {
|
|
368
|
+
depositAddress,
|
|
369
|
+
beneficiary: options.beneficiary,
|
|
370
|
+
value: options.amount,
|
|
371
|
+
lightClients: shuffled,
|
|
372
|
+
nullifier,
|
|
373
|
+
},
|
|
374
|
+
} as const;
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
const fetchLightClients = Effect.fn(function* (options: {
|
|
378
|
+
zAssetAddress: Domain.ZAssetAddress;
|
|
379
|
+
clientIds: number[];
|
|
380
|
+
}) {
|
|
381
|
+
const { zAssetAddress, clientIds } = options;
|
|
382
|
+
const dstClient = yield* PublicClient.PublicClient;
|
|
383
|
+
const ibcHandlerAddress =
|
|
384
|
+
yield* dstClient.getIbcHandlerAddress(zAssetAddress);
|
|
385
|
+
const results: LightClientData[] = [];
|
|
386
|
+
for (const clientId of clientIds) {
|
|
387
|
+
const lightClientAddress = yield* dstClient.getLightClientAddress(
|
|
388
|
+
ibcHandlerAddress,
|
|
389
|
+
clientId,
|
|
390
|
+
);
|
|
391
|
+
const height = yield* dstClient.getLatestHeight(
|
|
392
|
+
lightClientAddress,
|
|
393
|
+
clientId,
|
|
394
|
+
);
|
|
395
|
+
const stateRootIndex = yield* dstClient.getStateRootIndex(
|
|
396
|
+
zAssetAddress,
|
|
397
|
+
clientId,
|
|
398
|
+
);
|
|
399
|
+
const { stateRoot } = yield* dstClient.getConsensusState(
|
|
400
|
+
lightClientAddress,
|
|
401
|
+
clientId,
|
|
402
|
+
height,
|
|
403
|
+
stateRootIndex,
|
|
404
|
+
);
|
|
405
|
+
|
|
406
|
+
results.push({ clientId, height, stateRoot });
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
return results;
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
export const prepareRedemption = Effect.fn(function* (options: {
|
|
413
|
+
/** The 32-byte secret payment key as a hex string */
|
|
414
|
+
paymentKey: PS.Hex;
|
|
415
|
+
/** Array of 0-4 beneficiary addresses */
|
|
416
|
+
beneficiaries: Address[];
|
|
417
|
+
/** The beneficiary address to redeem to */
|
|
418
|
+
beneficiary: Address;
|
|
419
|
+
/** Amount to redeem */
|
|
420
|
+
amount: bigint;
|
|
421
|
+
/** Light client IDs to include in the proof (for anonymity set) */
|
|
422
|
+
clientIds: number[];
|
|
423
|
+
/** The specific light client ID to use for the proof */
|
|
424
|
+
selectedClientId: number;
|
|
425
|
+
srcChainId: bigint;
|
|
426
|
+
dstChainId: bigint;
|
|
427
|
+
srcErc20Address: Domain.Erc20Address;
|
|
428
|
+
dstErc20Address: Domain.Erc20Address;
|
|
429
|
+
/** Auto unwrap */
|
|
430
|
+
unwrap?: boolean | undefined;
|
|
431
|
+
}) {
|
|
432
|
+
const dstWalletClient = yield* WalletClient.DestinationWalletClient;
|
|
433
|
+
const attestor = yield* Attestor.Attestor;
|
|
434
|
+
|
|
435
|
+
// 1. Generate proof
|
|
436
|
+
const proofResult = yield* generateProof({
|
|
437
|
+
secret: options.paymentKey,
|
|
438
|
+
beneficiaries: options.beneficiaries as unknown as any,
|
|
439
|
+
beneficiary: options.beneficiary,
|
|
440
|
+
amount: options.amount,
|
|
441
|
+
clientIds: options.clientIds,
|
|
442
|
+
selectedClientId: options.selectedClientId,
|
|
443
|
+
srcChainId: options.srcChainId,
|
|
444
|
+
dstChainId: options.dstChainId,
|
|
445
|
+
srcErc20Address: options.srcErc20Address,
|
|
446
|
+
dstErc20Address: options.dstErc20Address,
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
yield* Effect.log({ proofResult });
|
|
450
|
+
|
|
451
|
+
const depositAddress = yield* getDepositAddress(
|
|
452
|
+
options.paymentKey,
|
|
453
|
+
options.beneficiaries,
|
|
454
|
+
options.dstChainId,
|
|
455
|
+
);
|
|
456
|
+
|
|
457
|
+
yield* Effect.log({ depositAddress });
|
|
458
|
+
|
|
459
|
+
// 2. Get attestation
|
|
460
|
+
const attestationResponse = yield* attestor.get({
|
|
461
|
+
unspendableAddress: depositAddress,
|
|
462
|
+
beneficiary: options.beneficiary,
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
yield* Effect.log({ attestationResponse });
|
|
466
|
+
|
|
467
|
+
// 3. Build redeem params
|
|
468
|
+
const redeemParams = Utils.proofJsonToRedeemParams(proofResult.proof, {
|
|
469
|
+
lightClients: proofResult.metadata.lightClients,
|
|
470
|
+
nullifier: proofResult.metadata.nullifier,
|
|
471
|
+
value: proofResult.metadata.value,
|
|
472
|
+
beneficiary: proofResult.metadata.beneficiary,
|
|
473
|
+
attestedMessage: attestationResponse.attestedMessage,
|
|
474
|
+
signature: attestationResponse.signature,
|
|
475
|
+
});
|
|
476
|
+
|
|
477
|
+
yield* Effect.log({ redeemParams });
|
|
478
|
+
|
|
479
|
+
return yield* dstWalletClient.prepareRedemption({
|
|
480
|
+
...redeemParams,
|
|
481
|
+
dstErc20Address: options.dstErc20Address,
|
|
482
|
+
});
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
export const generateKey = Effect.gen(function* () {
|
|
486
|
+
while (true) {
|
|
487
|
+
const bytes = new Uint8Array(32);
|
|
488
|
+
crypto.getRandomValues(bytes);
|
|
489
|
+
const value = BigInt(
|
|
490
|
+
"0x" +
|
|
491
|
+
Array.from(bytes)
|
|
492
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
493
|
+
.join(""),
|
|
494
|
+
);
|
|
495
|
+
if (value < PRIME) {
|
|
496
|
+
return ("0x" +
|
|
497
|
+
Array.from(bytes)
|
|
498
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
499
|
+
.join("")) as PS.Hex;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
export const prepareDeposit = Effect.fn("deposit")((options: DepositOptions) =>
|
|
505
|
+
Effect.gen(function* () {
|
|
506
|
+
const srcWalletClient = yield* WalletClient.SourceWalletClient;
|
|
507
|
+
|
|
508
|
+
const depositAddress = yield* getDepositAddress(
|
|
509
|
+
options.paymentKey,
|
|
510
|
+
options.beneficiaries,
|
|
511
|
+
options.destinationChainId,
|
|
512
|
+
);
|
|
513
|
+
|
|
514
|
+
return yield* srcWalletClient.prepareDeposit({
|
|
515
|
+
amount: options.amount,
|
|
516
|
+
depositAddress,
|
|
517
|
+
sourceChainId: options.sourceChainId,
|
|
518
|
+
srcErc20Address: options.srcErc20Address,
|
|
519
|
+
beneficiaries: options.beneficiaries,
|
|
520
|
+
destinationChainId: options.destinationChainId,
|
|
521
|
+
});
|
|
522
|
+
}),
|
|
523
|
+
);
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import { TypeIdError } from "./Error.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @since 1.0.0
|
|
8
|
+
*/
|
|
9
|
+
export const PaymentErrorTypeId: unique symbol = Symbol.for(
|
|
10
|
+
"@unionlabs/payments/PaymentError",
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @since 1.0.0
|
|
15
|
+
*/
|
|
16
|
+
export type PaymentErrorTypeId = typeof PaymentErrorTypeId;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @since 1.0.0
|
|
20
|
+
*/
|
|
21
|
+
export class PaymentError extends TypeIdError(
|
|
22
|
+
PaymentErrorTypeId,
|
|
23
|
+
"PaymentError",
|
|
24
|
+
)<{
|
|
25
|
+
cause: unknown;
|
|
26
|
+
message?: string;
|
|
27
|
+
}> {}
|
|
28
|
+
|
|
29
|
+
// /**
|
|
30
|
+
// * @since 1.0.0
|
|
31
|
+
// */
|
|
32
|
+
// export class ResultLengthMismatch extends TypeIdError(PaymentErrorTypeId, "ResultLengthMismatch")<{
|
|
33
|
+
// readonly expected: number
|
|
34
|
+
// readonly actual: number
|
|
35
|
+
// }> {
|
|
36
|
+
// get message() {
|
|
37
|
+
// return `Expected ${this.expected} results but got ${this.actual}`
|
|
38
|
+
// }
|
|
39
|
+
// }
|