envoy-pay 0.1.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/CHANGELOG.md +99 -0
- package/LICENSE +200 -0
- package/README.md +529 -0
- package/dist/cjs/adapters/base.js +174 -0
- package/dist/cjs/adapters/base.js.map +1 -0
- package/dist/cjs/adapters/evm.js +339 -0
- package/dist/cjs/adapters/evm.js.map +1 -0
- package/dist/cjs/adapters/index.js +15 -0
- package/dist/cjs/adapters/index.js.map +1 -0
- package/dist/cjs/adapters/ows.js +204 -0
- package/dist/cjs/adapters/ows.js.map +1 -0
- package/dist/cjs/adapters/solana.js +210 -0
- package/dist/cjs/adapters/solana.js.map +1 -0
- package/dist/cjs/adapters/stellar.js +173 -0
- package/dist/cjs/adapters/stellar.js.map +1 -0
- package/dist/cjs/adapters/stripe.js +338 -0
- package/dist/cjs/adapters/stripe.js.map +1 -0
- package/dist/cjs/adapters/types.js +3 -0
- package/dist/cjs/adapters/types.js.map +1 -0
- package/dist/cjs/client.js +309 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/contracts/abis/EnvoyFacilitator.js +197 -0
- package/dist/cjs/contracts/abis/EnvoyFacilitator.js.map +1 -0
- package/dist/cjs/contracts/addresses.js +42 -0
- package/dist/cjs/contracts/addresses.js.map +1 -0
- package/dist/cjs/contracts/facilitator.js +225 -0
- package/dist/cjs/contracts/facilitator.js.map +1 -0
- package/dist/cjs/contracts/index.js +21 -0
- package/dist/cjs/contracts/index.js.map +1 -0
- package/dist/cjs/facilitator/facilitator-service.js +305 -0
- package/dist/cjs/facilitator/facilitator-service.js.map +1 -0
- package/dist/cjs/facilitator/fee-calculator.js +134 -0
- package/dist/cjs/facilitator/fee-calculator.js.map +1 -0
- package/dist/cjs/facilitator/index.js +12 -0
- package/dist/cjs/facilitator/index.js.map +1 -0
- package/dist/cjs/facilitator/types.js +99 -0
- package/dist/cjs/facilitator/types.js.map +1 -0
- package/dist/cjs/identity/agent-card.js +143 -0
- package/dist/cjs/identity/agent-card.js.map +1 -0
- package/dist/cjs/identity/agent-identity.js +166 -0
- package/dist/cjs/identity/agent-identity.js.map +1 -0
- package/dist/cjs/identity/did-resolver.js +149 -0
- package/dist/cjs/identity/did-resolver.js.map +1 -0
- package/dist/cjs/identity/erc8004/abis.js +218 -0
- package/dist/cjs/identity/erc8004/abis.js.map +1 -0
- package/dist/cjs/identity/erc8004/identity.js +268 -0
- package/dist/cjs/identity/erc8004/identity.js.map +1 -0
- package/dist/cjs/identity/erc8004/index.js +36 -0
- package/dist/cjs/identity/erc8004/index.js.map +1 -0
- package/dist/cjs/identity/erc8004/reputation.js +110 -0
- package/dist/cjs/identity/erc8004/reputation.js.map +1 -0
- package/dist/cjs/identity/erc8004/types.js +3 -0
- package/dist/cjs/identity/erc8004/types.js.map +1 -0
- package/dist/cjs/identity/index.js +61 -0
- package/dist/cjs/identity/index.js.map +1 -0
- package/dist/cjs/identity/owner-registry.js +140 -0
- package/dist/cjs/identity/owner-registry.js.map +1 -0
- package/dist/cjs/identity/reputation.js +193 -0
- package/dist/cjs/identity/reputation.js.map +1 -0
- package/dist/cjs/identity/types.js +16 -0
- package/dist/cjs/identity/types.js.map +1 -0
- package/dist/cjs/index.js +72 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/logger.js +7 -0
- package/dist/cjs/logger.js.map +1 -0
- package/dist/cjs/monitor/evm-watcher.js +165 -0
- package/dist/cjs/monitor/evm-watcher.js.map +1 -0
- package/dist/cjs/monitor/index.js +32 -0
- package/dist/cjs/monitor/index.js.map +1 -0
- package/dist/cjs/monitor/multi-watcher.js +94 -0
- package/dist/cjs/monitor/multi-watcher.js.map +1 -0
- package/dist/cjs/monitor/solana-watcher.js +172 -0
- package/dist/cjs/monitor/solana-watcher.js.map +1 -0
- package/dist/cjs/monitor/stellar-watcher.js +125 -0
- package/dist/cjs/monitor/stellar-watcher.js.map +1 -0
- package/dist/cjs/mpp.js +187 -0
- package/dist/cjs/mpp.js.map +1 -0
- package/dist/cjs/policy.js +71 -0
- package/dist/cjs/policy.js.map +1 -0
- package/dist/cjs/providers/bridge.js +323 -0
- package/dist/cjs/providers/bridge.js.map +1 -0
- package/dist/cjs/providers/onchainos.js +210 -0
- package/dist/cjs/providers/onchainos.js.map +1 -0
- package/dist/cjs/requests/eip681.js +77 -0
- package/dist/cjs/requests/eip681.js.map +1 -0
- package/dist/cjs/requests/index.js +18 -0
- package/dist/cjs/requests/index.js.map +1 -0
- package/dist/cjs/requests/sep7.js +61 -0
- package/dist/cjs/requests/sep7.js.map +1 -0
- package/dist/cjs/requests/solana-pay.js +51 -0
- package/dist/cjs/requests/solana-pay.js.map +1 -0
- package/dist/cjs/requests/universal.js +40 -0
- package/dist/cjs/requests/universal.js.map +1 -0
- package/dist/cjs/server/index.js +35 -0
- package/dist/cjs/server/index.js.map +1 -0
- package/dist/cjs/server/mpp-gate.js +118 -0
- package/dist/cjs/server/mpp-gate.js.map +1 -0
- package/dist/cjs/server/payment-gate.js +92 -0
- package/dist/cjs/server/payment-gate.js.map +1 -0
- package/dist/cjs/server/receipt.js +52 -0
- package/dist/cjs/server/receipt.js.map +1 -0
- package/dist/cjs/server/webhook.js +122 -0
- package/dist/cjs/server/webhook.js.map +1 -0
- package/dist/cjs/server/x402-gate.js +103 -0
- package/dist/cjs/server/x402-gate.js.map +1 -0
- package/dist/cjs/solana.js +14 -0
- package/dist/cjs/solana.js.map +1 -0
- package/dist/cjs/stellar.js +14 -0
- package/dist/cjs/stellar.js.map +1 -0
- package/dist/cjs/wallet/balance-aggregator.js +149 -0
- package/dist/cjs/wallet/balance-aggregator.js.map +1 -0
- package/dist/cjs/wallet/chain-router.js +254 -0
- package/dist/cjs/wallet/chain-router.js.map +1 -0
- package/dist/cjs/wallet/index.js +15 -0
- package/dist/cjs/wallet/index.js.map +1 -0
- package/dist/cjs/wallet/intent-resolver.js +145 -0
- package/dist/cjs/wallet/intent-resolver.js.map +1 -0
- package/dist/cjs/wallet/session-manager.js +170 -0
- package/dist/cjs/wallet/session-manager.js.map +1 -0
- package/dist/cjs/wallet/types.js +14 -0
- package/dist/cjs/wallet/types.js.map +1 -0
- package/dist/cjs/wallet/unified-wallet.js +253 -0
- package/dist/cjs/wallet/unified-wallet.js.map +1 -0
- package/dist/esm/adapters/base.js +170 -0
- package/dist/esm/adapters/base.js.map +1 -0
- package/dist/esm/adapters/evm.js +334 -0
- package/dist/esm/adapters/evm.js.map +1 -0
- package/dist/esm/adapters/index.js +6 -0
- package/dist/esm/adapters/index.js.map +1 -0
- package/dist/esm/adapters/ows.js +194 -0
- package/dist/esm/adapters/ows.js.map +1 -0
- package/dist/esm/adapters/solana.js +206 -0
- package/dist/esm/adapters/solana.js.map +1 -0
- package/dist/esm/adapters/stellar.js +136 -0
- package/dist/esm/adapters/stellar.js.map +1 -0
- package/dist/esm/adapters/stripe.js +334 -0
- package/dist/esm/adapters/stripe.js.map +1 -0
- package/dist/esm/adapters/types.js +2 -0
- package/dist/esm/adapters/types.js.map +1 -0
- package/dist/esm/client.js +302 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/contracts/abis/EnvoyFacilitator.js +194 -0
- package/dist/esm/contracts/abis/EnvoyFacilitator.js.map +1 -0
- package/dist/esm/contracts/addresses.js +38 -0
- package/dist/esm/contracts/addresses.js.map +1 -0
- package/dist/esm/contracts/facilitator.js +218 -0
- package/dist/esm/contracts/facilitator.js.map +1 -0
- package/dist/esm/contracts/index.js +8 -0
- package/dist/esm/contracts/index.js.map +1 -0
- package/dist/esm/facilitator/facilitator-service.js +301 -0
- package/dist/esm/facilitator/facilitator-service.js.map +1 -0
- package/dist/esm/facilitator/fee-calculator.js +130 -0
- package/dist/esm/facilitator/fee-calculator.js.map +1 -0
- package/dist/esm/facilitator/index.js +5 -0
- package/dist/esm/facilitator/index.js.map +1 -0
- package/dist/esm/facilitator/types.js +96 -0
- package/dist/esm/facilitator/types.js.map +1 -0
- package/dist/esm/identity/agent-card.js +139 -0
- package/dist/esm/identity/agent-card.js.map +1 -0
- package/dist/esm/identity/agent-identity.js +162 -0
- package/dist/esm/identity/agent-identity.js.map +1 -0
- package/dist/esm/identity/did-resolver.js +145 -0
- package/dist/esm/identity/did-resolver.js.map +1 -0
- package/dist/esm/identity/erc8004/abis.js +215 -0
- package/dist/esm/identity/erc8004/abis.js.map +1 -0
- package/dist/esm/identity/erc8004/identity.js +250 -0
- package/dist/esm/identity/erc8004/identity.js.map +1 -0
- package/dist/esm/identity/erc8004/index.js +13 -0
- package/dist/esm/identity/erc8004/index.js.map +1 -0
- package/dist/esm/identity/erc8004/reputation.js +105 -0
- package/dist/esm/identity/erc8004/reputation.js.map +1 -0
- package/dist/esm/identity/erc8004/types.js +2 -0
- package/dist/esm/identity/erc8004/types.js.map +1 -0
- package/dist/esm/identity/index.js +19 -0
- package/dist/esm/identity/index.js.map +1 -0
- package/dist/esm/identity/owner-registry.js +136 -0
- package/dist/esm/identity/owner-registry.js.map +1 -0
- package/dist/esm/identity/reputation.js +189 -0
- package/dist/esm/identity/reputation.js.map +1 -0
- package/dist/esm/identity/types.js +15 -0
- package/dist/esm/identity/types.js.map +1 -0
- package/dist/esm/index.js +37 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/logger.js +3 -0
- package/dist/esm/logger.js.map +1 -0
- package/dist/esm/monitor/evm-watcher.js +162 -0
- package/dist/esm/monitor/evm-watcher.js.map +1 -0
- package/dist/esm/monitor/index.js +25 -0
- package/dist/esm/monitor/index.js.map +1 -0
- package/dist/esm/monitor/multi-watcher.js +91 -0
- package/dist/esm/monitor/multi-watcher.js.map +1 -0
- package/dist/esm/monitor/solana-watcher.js +169 -0
- package/dist/esm/monitor/solana-watcher.js.map +1 -0
- package/dist/esm/monitor/stellar-watcher.js +122 -0
- package/dist/esm/monitor/stellar-watcher.js.map +1 -0
- package/dist/esm/mpp.js +175 -0
- package/dist/esm/mpp.js.map +1 -0
- package/dist/esm/policy.js +67 -0
- package/dist/esm/policy.js.map +1 -0
- package/dist/esm/providers/bridge.js +319 -0
- package/dist/esm/providers/bridge.js.map +1 -0
- package/dist/esm/providers/onchainos.js +172 -0
- package/dist/esm/providers/onchainos.js.map +1 -0
- package/dist/esm/requests/eip681.js +74 -0
- package/dist/esm/requests/eip681.js.map +1 -0
- package/dist/esm/requests/index.js +11 -0
- package/dist/esm/requests/index.js.map +1 -0
- package/dist/esm/requests/sep7.js +58 -0
- package/dist/esm/requests/sep7.js.map +1 -0
- package/dist/esm/requests/solana-pay.js +48 -0
- package/dist/esm/requests/solana-pay.js.map +1 -0
- package/dist/esm/requests/universal.js +37 -0
- package/dist/esm/requests/universal.js.map +1 -0
- package/dist/esm/server/index.js +27 -0
- package/dist/esm/server/index.js.map +1 -0
- package/dist/esm/server/mpp-gate.js +115 -0
- package/dist/esm/server/mpp-gate.js.map +1 -0
- package/dist/esm/server/payment-gate.js +89 -0
- package/dist/esm/server/payment-gate.js.map +1 -0
- package/dist/esm/server/receipt.js +48 -0
- package/dist/esm/server/receipt.js.map +1 -0
- package/dist/esm/server/webhook.js +119 -0
- package/dist/esm/server/webhook.js.map +1 -0
- package/dist/esm/server/x402-gate.js +100 -0
- package/dist/esm/server/x402-gate.js.map +1 -0
- package/dist/esm/solana.js +8 -0
- package/dist/esm/solana.js.map +1 -0
- package/dist/esm/stellar.js +8 -0
- package/dist/esm/stellar.js.map +1 -0
- package/dist/esm/wallet/balance-aggregator.js +145 -0
- package/dist/esm/wallet/balance-aggregator.js.map +1 -0
- package/dist/esm/wallet/chain-router.js +250 -0
- package/dist/esm/wallet/chain-router.js.map +1 -0
- package/dist/esm/wallet/index.js +7 -0
- package/dist/esm/wallet/index.js.map +1 -0
- package/dist/esm/wallet/intent-resolver.js +141 -0
- package/dist/esm/wallet/intent-resolver.js.map +1 -0
- package/dist/esm/wallet/session-manager.js +166 -0
- package/dist/esm/wallet/session-manager.js.map +1 -0
- package/dist/esm/wallet/types.js +13 -0
- package/dist/esm/wallet/types.js.map +1 -0
- package/dist/esm/wallet/unified-wallet.js +249 -0
- package/dist/esm/wallet/unified-wallet.js.map +1 -0
- package/dist/types/adapters/base.d.ts +53 -0
- package/dist/types/adapters/base.d.ts.map +1 -0
- package/dist/types/adapters/evm.d.ts +93 -0
- package/dist/types/adapters/evm.d.ts.map +1 -0
- package/dist/types/adapters/index.d.ts +7 -0
- package/dist/types/adapters/index.d.ts.map +1 -0
- package/dist/types/adapters/ows.d.ts +123 -0
- package/dist/types/adapters/ows.d.ts.map +1 -0
- package/dist/types/adapters/solana.d.ts +77 -0
- package/dist/types/adapters/solana.d.ts.map +1 -0
- package/dist/types/adapters/stellar.d.ts +67 -0
- package/dist/types/adapters/stellar.d.ts.map +1 -0
- package/dist/types/adapters/stripe.d.ts +206 -0
- package/dist/types/adapters/stripe.d.ts.map +1 -0
- package/dist/types/adapters/types.d.ts +110 -0
- package/dist/types/adapters/types.d.ts.map +1 -0
- package/dist/types/client.d.ts +89 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/contracts/abis/EnvoyFacilitator.d.ts +296 -0
- package/dist/types/contracts/abis/EnvoyFacilitator.d.ts.map +1 -0
- package/dist/types/contracts/addresses.d.ts +24 -0
- package/dist/types/contracts/addresses.d.ts.map +1 -0
- package/dist/types/contracts/facilitator.d.ts +172 -0
- package/dist/types/contracts/facilitator.d.ts.map +1 -0
- package/dist/types/contracts/index.d.ts +6 -0
- package/dist/types/contracts/index.d.ts.map +1 -0
- package/dist/types/facilitator/facilitator-service.d.ts +69 -0
- package/dist/types/facilitator/facilitator-service.d.ts.map +1 -0
- package/dist/types/facilitator/fee-calculator.d.ts +48 -0
- package/dist/types/facilitator/fee-calculator.d.ts.map +1 -0
- package/dist/types/facilitator/index.d.ts +5 -0
- package/dist/types/facilitator/index.d.ts.map +1 -0
- package/dist/types/facilitator/types.d.ts +221 -0
- package/dist/types/facilitator/types.d.ts.map +1 -0
- package/dist/types/identity/agent-card.d.ts +83 -0
- package/dist/types/identity/agent-card.d.ts.map +1 -0
- package/dist/types/identity/agent-identity.d.ts +102 -0
- package/dist/types/identity/agent-identity.d.ts.map +1 -0
- package/dist/types/identity/did-resolver.d.ts +70 -0
- package/dist/types/identity/did-resolver.d.ts.map +1 -0
- package/dist/types/identity/erc8004/abis.d.ts +336 -0
- package/dist/types/identity/erc8004/abis.d.ts.map +1 -0
- package/dist/types/identity/erc8004/identity.d.ts +109 -0
- package/dist/types/identity/erc8004/identity.d.ts.map +1 -0
- package/dist/types/identity/erc8004/index.d.ts +15 -0
- package/dist/types/identity/erc8004/index.d.ts.map +1 -0
- package/dist/types/identity/erc8004/reputation.d.ts +52 -0
- package/dist/types/identity/erc8004/reputation.d.ts.map +1 -0
- package/dist/types/identity/erc8004/types.d.ts +31 -0
- package/dist/types/identity/erc8004/types.d.ts.map +1 -0
- package/dist/types/identity/index.d.ts +10 -0
- package/dist/types/identity/index.d.ts.map +1 -0
- package/dist/types/identity/owner-registry.d.ts +68 -0
- package/dist/types/identity/owner-registry.d.ts.map +1 -0
- package/dist/types/identity/reputation.d.ts +66 -0
- package/dist/types/identity/reputation.d.ts.map +1 -0
- package/dist/types/identity/types.d.ts +182 -0
- package/dist/types/identity/types.d.ts.map +1 -0
- package/dist/types/index.d.ts +17 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/logger.d.ts +10 -0
- package/dist/types/logger.d.ts.map +1 -0
- package/dist/types/monitor/evm-watcher.d.ts +40 -0
- package/dist/types/monitor/evm-watcher.d.ts.map +1 -0
- package/dist/types/monitor/index.d.ts +25 -0
- package/dist/types/monitor/index.d.ts.map +1 -0
- package/dist/types/monitor/multi-watcher.d.ts +48 -0
- package/dist/types/monitor/multi-watcher.d.ts.map +1 -0
- package/dist/types/monitor/solana-watcher.d.ts +36 -0
- package/dist/types/monitor/solana-watcher.d.ts.map +1 -0
- package/dist/types/monitor/stellar-watcher.d.ts +34 -0
- package/dist/types/monitor/stellar-watcher.d.ts.map +1 -0
- package/dist/types/mpp.d.ts +153 -0
- package/dist/types/mpp.d.ts.map +1 -0
- package/dist/types/policy.d.ts +40 -0
- package/dist/types/policy.d.ts.map +1 -0
- package/dist/types/providers/bridge.d.ts +162 -0
- package/dist/types/providers/bridge.d.ts.map +1 -0
- package/dist/types/providers/onchainos.d.ts +128 -0
- package/dist/types/providers/onchainos.d.ts.map +1 -0
- package/dist/types/requests/eip681.d.ts +51 -0
- package/dist/types/requests/eip681.d.ts.map +1 -0
- package/dist/types/requests/index.d.ts +11 -0
- package/dist/types/requests/index.d.ts.map +1 -0
- package/dist/types/requests/sep7.d.ts +56 -0
- package/dist/types/requests/sep7.d.ts.map +1 -0
- package/dist/types/requests/solana-pay.d.ts +50 -0
- package/dist/types/requests/solana-pay.d.ts.map +1 -0
- package/dist/types/requests/universal.d.ts +28 -0
- package/dist/types/requests/universal.d.ts.map +1 -0
- package/dist/types/server/index.d.ts +27 -0
- package/dist/types/server/index.d.ts.map +1 -0
- package/dist/types/server/mpp-gate.d.ts +66 -0
- package/dist/types/server/mpp-gate.d.ts.map +1 -0
- package/dist/types/server/payment-gate.d.ts +33 -0
- package/dist/types/server/payment-gate.d.ts.map +1 -0
- package/dist/types/server/receipt.d.ts +52 -0
- package/dist/types/server/receipt.d.ts.map +1 -0
- package/dist/types/server/webhook.d.ts +46 -0
- package/dist/types/server/webhook.d.ts.map +1 -0
- package/dist/types/server/x402-gate.d.ts +70 -0
- package/dist/types/server/x402-gate.d.ts.map +1 -0
- package/dist/types/solana.d.ts +7 -0
- package/dist/types/solana.d.ts.map +1 -0
- package/dist/types/stellar.d.ts +7 -0
- package/dist/types/stellar.d.ts.map +1 -0
- package/dist/types/wallet/balance-aggregator.d.ts +51 -0
- package/dist/types/wallet/balance-aggregator.d.ts.map +1 -0
- package/dist/types/wallet/chain-router.d.ts +44 -0
- package/dist/types/wallet/chain-router.d.ts.map +1 -0
- package/dist/types/wallet/index.d.ts +7 -0
- package/dist/types/wallet/index.d.ts.map +1 -0
- package/dist/types/wallet/intent-resolver.d.ts +39 -0
- package/dist/types/wallet/intent-resolver.d.ts.map +1 -0
- package/dist/types/wallet/session-manager.d.ts +57 -0
- package/dist/types/wallet/session-manager.d.ts.map +1 -0
- package/dist/types/wallet/types.d.ts +161 -0
- package/dist/types/wallet/types.d.ts.map +1 -0
- package/dist/types/wallet/unified-wallet.d.ts +122 -0
- package/dist/types/wallet/unified-wallet.d.ts.map +1 -0
- package/package.json +194 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IntentResolver — Parses natural-language payment intents into PaymentPlans.
|
|
3
|
+
*
|
|
4
|
+
* Agents express payment desires as simple strings ("pay $5", "send 10 USDC
|
|
5
|
+
* to 0x1234..."). The IntentResolver parses these into structured PayIntent
|
|
6
|
+
* objects, then delegates to ChainRouter for execution planning.
|
|
7
|
+
*
|
|
8
|
+
* Supports:
|
|
9
|
+
* - "$5" / "$5.00" — USD amounts
|
|
10
|
+
* - "5 USDC" / "10 XLM" — Asset-specific amounts
|
|
11
|
+
* - "to 0x..." / "to G..." / "to ..." — destination extraction
|
|
12
|
+
* - "memo: invoice-123" — memo extraction
|
|
13
|
+
*
|
|
14
|
+
* @see ERC-7521 — Intent-centric execution pattern
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Pattern: "$5.00" or "$5"
|
|
18
|
+
*/
|
|
19
|
+
const USD_AMOUNT_RE = /\$(\d+(?:\.\d{1,2})?)/;
|
|
20
|
+
/**
|
|
21
|
+
* Pattern: "5 USDC" or "10.5 ETH"
|
|
22
|
+
*/
|
|
23
|
+
const ASSET_AMOUNT_RE = /(\d+(?:\.\d+)?)\s+(USDC|ETH|XLM|SOL|USD|USDT|DAI|BTC)/i;
|
|
24
|
+
/**
|
|
25
|
+
* Pattern: Ethereum-style address "0x..." (42 chars)
|
|
26
|
+
*/
|
|
27
|
+
const ETH_ADDRESS_RE = /\b(0x[a-fA-F0-9]{40})\b/;
|
|
28
|
+
/**
|
|
29
|
+
* Pattern: Stellar-style address "G..." (56 chars)
|
|
30
|
+
*/
|
|
31
|
+
const STELLAR_ADDRESS_RE = /\b(G[A-Z2-7]{55})\b/;
|
|
32
|
+
/**
|
|
33
|
+
* Pattern: Solana-style address (base58, 32-44 chars)
|
|
34
|
+
*/
|
|
35
|
+
const SOLANA_ADDRESS_RE = /\b([1-9A-HJ-NP-Za-km-z]{32,44})\b/;
|
|
36
|
+
/**
|
|
37
|
+
* Pattern: "memo: <text>" or "memo:<text>"
|
|
38
|
+
*/
|
|
39
|
+
const MEMO_RE = /memo:\s*([^\s,]+)/i;
|
|
40
|
+
/**
|
|
41
|
+
* Rough USD rates for intent parsing (same as BalanceAggregator).
|
|
42
|
+
*/
|
|
43
|
+
const INTENT_RATES = {
|
|
44
|
+
USDC: 1,
|
|
45
|
+
USDT: 1,
|
|
46
|
+
DAI: 1,
|
|
47
|
+
USD: 1,
|
|
48
|
+
cUSD: 1,
|
|
49
|
+
CUSD: 1,
|
|
50
|
+
cEUR: 1.08,
|
|
51
|
+
CEUR: 1.08,
|
|
52
|
+
cREAL: 0.2,
|
|
53
|
+
CREAL: 0.2,
|
|
54
|
+
CELO: 0.7,
|
|
55
|
+
ETH: 3200,
|
|
56
|
+
XLM: 0.12,
|
|
57
|
+
SOL: 170,
|
|
58
|
+
BTC: 95000,
|
|
59
|
+
};
|
|
60
|
+
export class IntentResolver {
|
|
61
|
+
/**
|
|
62
|
+
* Parse a natural-language payment intent string into a structured PayIntent.
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* resolve('pay $5 to 0x1234...'); // { amount: '5.00', destination: '0x1234...' }
|
|
66
|
+
* resolve('send 100 USDC memo: inv-42'); // { amount: '100', asset: 'USDC', memo: 'inv-42' }
|
|
67
|
+
* resolve('$0.50'); // { amount: '0.50' }
|
|
68
|
+
*/
|
|
69
|
+
resolve(input) {
|
|
70
|
+
const intent = {
|
|
71
|
+
amount: '0',
|
|
72
|
+
};
|
|
73
|
+
// ── Extract USD amount ──────────────────────────────────────────
|
|
74
|
+
const usdMatch = input.match(USD_AMOUNT_RE);
|
|
75
|
+
if (usdMatch) {
|
|
76
|
+
intent.amount = usdMatch[1];
|
|
77
|
+
intent.asset = 'USDC';
|
|
78
|
+
}
|
|
79
|
+
// ── Extract asset-denominated amount ────────────────────────────
|
|
80
|
+
const assetMatch = input.match(ASSET_AMOUNT_RE);
|
|
81
|
+
if (assetMatch) {
|
|
82
|
+
const rawAmount = parseFloat(assetMatch[1]);
|
|
83
|
+
const asset = assetMatch[2].toUpperCase();
|
|
84
|
+
intent.asset = asset;
|
|
85
|
+
// Convert to USD for the amount field
|
|
86
|
+
const rate = INTENT_RATES[asset] ?? 1;
|
|
87
|
+
intent.amount = (rawAmount * rate).toFixed(2);
|
|
88
|
+
}
|
|
89
|
+
// ── Extract destination ─────────────────────────────────────────
|
|
90
|
+
const ethMatch = input.match(ETH_ADDRESS_RE);
|
|
91
|
+
if (ethMatch) {
|
|
92
|
+
intent.destination = ethMatch[1];
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const stellarMatch = input.match(STELLAR_ADDRESS_RE);
|
|
96
|
+
if (stellarMatch) {
|
|
97
|
+
intent.destination = stellarMatch[1];
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const solanaMatch = input.match(SOLANA_ADDRESS_RE);
|
|
101
|
+
if (solanaMatch) {
|
|
102
|
+
intent.destination = solanaMatch[1];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// ── Extract memo ────────────────────────────────────────────────
|
|
107
|
+
const memoMatch = input.match(MEMO_RE);
|
|
108
|
+
if (memoMatch) {
|
|
109
|
+
intent.memo = memoMatch[1];
|
|
110
|
+
}
|
|
111
|
+
return intent;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Validate that a PayIntent has the minimum required fields.
|
|
115
|
+
*/
|
|
116
|
+
validate(intent) {
|
|
117
|
+
const errors = [];
|
|
118
|
+
const amount = parseFloat(intent.amount);
|
|
119
|
+
if (isNaN(amount) || amount <= 0) {
|
|
120
|
+
errors.push('Amount must be a positive number');
|
|
121
|
+
}
|
|
122
|
+
if (amount > 1_000_000) {
|
|
123
|
+
errors.push('Amount exceeds maximum ($1,000,000)');
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
valid: errors.length === 0,
|
|
127
|
+
errors,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Convert a raw USD amount string to a specific asset amount.
|
|
132
|
+
*/
|
|
133
|
+
usdToAsset(usdAmount, asset) {
|
|
134
|
+
const usd = parseFloat(usdAmount);
|
|
135
|
+
if (isNaN(usd))
|
|
136
|
+
return '0';
|
|
137
|
+
const rate = INTENT_RATES[asset.toUpperCase()] ?? 1;
|
|
138
|
+
return (usd / rate).toFixed(asset.toUpperCase() === 'XLM' ? 7 : 6);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=intent-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent-resolver.js","sourceRoot":"","sources":["../../../src/wallet/intent-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionManager — Scoped, time-limited permission management.
|
|
3
|
+
*
|
|
4
|
+
* Implements session-key patterns inspired by EIP-7702, allowing
|
|
5
|
+
* agent owners to grant agents time-limited, capped permissions
|
|
6
|
+
* without exposing master private keys.
|
|
7
|
+
*
|
|
8
|
+
* Sessions enforce:
|
|
9
|
+
* - Per-transaction caps
|
|
10
|
+
* - Total session budget
|
|
11
|
+
* - Destination whitelists
|
|
12
|
+
* - Chain restrictions
|
|
13
|
+
* - Time-based expiry
|
|
14
|
+
*
|
|
15
|
+
* @see EIP-7702 — EOA → Smart Account delegation
|
|
16
|
+
* @see ERC-4337 — Account Abstraction session keys
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Generate a unique session ID.
|
|
20
|
+
*/
|
|
21
|
+
function generateSessionId() {
|
|
22
|
+
const timestamp = Date.now().toString(36);
|
|
23
|
+
const random = Math.random().toString(36).substring(2, 10);
|
|
24
|
+
return `sess_${timestamp}_${random}`;
|
|
25
|
+
}
|
|
26
|
+
export class SessionManager {
|
|
27
|
+
sessions = new Map();
|
|
28
|
+
/**
|
|
29
|
+
* Create a new session with scoped permissions.
|
|
30
|
+
*/
|
|
31
|
+
createSession(permissions) {
|
|
32
|
+
// Validate permissions
|
|
33
|
+
if (permissions.maxPerTransaction <= 0) {
|
|
34
|
+
throw new Error('maxPerTransaction must be positive');
|
|
35
|
+
}
|
|
36
|
+
if (permissions.maxTotal <= 0) {
|
|
37
|
+
throw new Error('maxTotal must be positive');
|
|
38
|
+
}
|
|
39
|
+
if (permissions.maxPerTransaction > permissions.maxTotal) {
|
|
40
|
+
throw new Error('maxPerTransaction cannot exceed maxTotal');
|
|
41
|
+
}
|
|
42
|
+
if (permissions.expiresAt.getTime() <= Date.now()) {
|
|
43
|
+
throw new Error('Session expiry must be in the future');
|
|
44
|
+
}
|
|
45
|
+
const session = {
|
|
46
|
+
id: generateSessionId(),
|
|
47
|
+
permissions,
|
|
48
|
+
spent: 0,
|
|
49
|
+
txCount: 0,
|
|
50
|
+
createdAt: new Date(),
|
|
51
|
+
isActive: true,
|
|
52
|
+
};
|
|
53
|
+
this.sessions.set(session.id, session);
|
|
54
|
+
return session;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Revoke (deactivate) a session by ID.
|
|
58
|
+
*/
|
|
59
|
+
revokeSession(sessionId) {
|
|
60
|
+
const session = this.sessions.get(sessionId);
|
|
61
|
+
if (!session)
|
|
62
|
+
return false;
|
|
63
|
+
session.isActive = false;
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check if a proposed spend is allowed within a session's permissions.
|
|
68
|
+
*/
|
|
69
|
+
checkSession(sessionId, amountUsd, destination, chain) {
|
|
70
|
+
const session = this.sessions.get(sessionId);
|
|
71
|
+
if (!session) {
|
|
72
|
+
return { allowed: false, reason: 'Session not found' };
|
|
73
|
+
}
|
|
74
|
+
if (!session.isActive) {
|
|
75
|
+
return { allowed: false, reason: 'Session revoked' };
|
|
76
|
+
}
|
|
77
|
+
// Check expiry
|
|
78
|
+
if (Date.now() > session.permissions.expiresAt.getTime()) {
|
|
79
|
+
session.isActive = false;
|
|
80
|
+
return { allowed: false, reason: 'Session expired' };
|
|
81
|
+
}
|
|
82
|
+
// Check per-transaction limit
|
|
83
|
+
if (amountUsd > session.permissions.maxPerTransaction) {
|
|
84
|
+
return {
|
|
85
|
+
allowed: false,
|
|
86
|
+
reason: `Amount $${amountUsd} exceeds per-tx limit of $${session.permissions.maxPerTransaction}`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// Check total session budget
|
|
90
|
+
if (session.spent + amountUsd > session.permissions.maxTotal) {
|
|
91
|
+
return {
|
|
92
|
+
allowed: false,
|
|
93
|
+
reason: `Amount $${amountUsd} would exceed session budget of $${session.permissions.maxTotal} (spent: $${session.spent})`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// Check destination whitelist
|
|
97
|
+
const allowedDest = session.permissions.allowedDestinations;
|
|
98
|
+
if (allowedDest && allowedDest.length > 0 && destination) {
|
|
99
|
+
if (!allowedDest.includes(destination)) {
|
|
100
|
+
return {
|
|
101
|
+
allowed: false,
|
|
102
|
+
reason: `Destination ${destination} not in session whitelist`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Check chain whitelist
|
|
107
|
+
const allowedChains = session.permissions.allowedChains;
|
|
108
|
+
if (allowedChains && allowedChains.length > 0 && chain) {
|
|
109
|
+
if (!allowedChains.includes(chain)) {
|
|
110
|
+
return {
|
|
111
|
+
allowed: false,
|
|
112
|
+
reason: `Chain ${chain} not allowed in this session`,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return { allowed: true };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Record a successful spend against a session.
|
|
120
|
+
*/
|
|
121
|
+
recordSpend(sessionId, amountUsd) {
|
|
122
|
+
const session = this.sessions.get(sessionId);
|
|
123
|
+
if (!session)
|
|
124
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
125
|
+
session.spent += amountUsd;
|
|
126
|
+
session.txCount += 1;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get a session by ID.
|
|
130
|
+
*/
|
|
131
|
+
getSession(sessionId) {
|
|
132
|
+
return this.sessions.get(sessionId);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* List all active sessions.
|
|
136
|
+
*/
|
|
137
|
+
getActiveSessions() {
|
|
138
|
+
const now = Date.now();
|
|
139
|
+
return Array.from(this.sessions.values()).filter((s) => s.isActive && now <= s.permissions.expiresAt.getTime());
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get the remaining budget for a session.
|
|
143
|
+
*/
|
|
144
|
+
getRemainingBudget(sessionId) {
|
|
145
|
+
const session = this.sessions.get(sessionId);
|
|
146
|
+
if (!session)
|
|
147
|
+
return 0;
|
|
148
|
+
return Math.max(0, session.permissions.maxTotal - session.spent);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Prune expired sessions from memory.
|
|
152
|
+
*/
|
|
153
|
+
pruneExpired() {
|
|
154
|
+
const now = Date.now();
|
|
155
|
+
let pruned = 0;
|
|
156
|
+
for (const [id, session] of this.sessions) {
|
|
157
|
+
if (now > session.permissions.expiresAt.getTime()) {
|
|
158
|
+
session.isActive = false;
|
|
159
|
+
this.sessions.delete(id);
|
|
160
|
+
pruned++;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return pruned;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../src/wallet/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wallet Abstraction Types — Unified multi-chain balance & routing.
|
|
3
|
+
*
|
|
4
|
+
* These types power the UnifiedWallet, which abstracts away chain selection
|
|
5
|
+
* so that AI agents can simply say "pay $5" without knowing which chain,
|
|
6
|
+
* token, or gas mechanics are involved.
|
|
7
|
+
*
|
|
8
|
+
* @see EIP-7702 — Session keys & smart account delegation
|
|
9
|
+
* @see ERC-7521 — Intent-based execution
|
|
10
|
+
* @see ERC-4337 — Account abstraction (paymasters)
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/wallet/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UnifiedWallet — Single entry point for multi-chain payments.
|
|
3
|
+
*
|
|
4
|
+
* Wraps multiple PaymentAdapters behind a unified interface so that
|
|
5
|
+
* AI agents can simply call `wallet.pay('$5')` without knowing about
|
|
6
|
+
* chains, tokens, gas, or atomic units.
|
|
7
|
+
*
|
|
8
|
+
* Architecture:
|
|
9
|
+
* ```
|
|
10
|
+
* Agent → UnifiedWallet → ChainRouter → best PaymentAdapter → settlement
|
|
11
|
+
* → BalanceAggregator → unified balance
|
|
12
|
+
* → IntentResolver → structured payment intent
|
|
13
|
+
* → SessionManager → scoped permissions
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* const wallet = new UnifiedWallet({
|
|
19
|
+
* adapters: [evmAdapter, stellarAdapter, solanaAdapter],
|
|
20
|
+
* strategy: 'cheapest',
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* // Agent just pays — no chain knowledge needed
|
|
24
|
+
* const result = await wallet.pay({ amount: '5.00' });
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @see EIP-7702 — Smart account delegation
|
|
28
|
+
* @see ERC-7521 — Intent-based execution
|
|
29
|
+
*/
|
|
30
|
+
import { BalanceAggregator } from './balance-aggregator.js';
|
|
31
|
+
import { ChainRouter } from './chain-router.js';
|
|
32
|
+
import { IntentResolver } from './intent-resolver.js';
|
|
33
|
+
import { SessionManager } from './session-manager.js';
|
|
34
|
+
export class UnifiedWallet {
|
|
35
|
+
adapters;
|
|
36
|
+
strategy;
|
|
37
|
+
log;
|
|
38
|
+
fallbackIndex;
|
|
39
|
+
balanceAggregator;
|
|
40
|
+
chainRouter;
|
|
41
|
+
intentResolver;
|
|
42
|
+
sessionManager;
|
|
43
|
+
constructor(options) {
|
|
44
|
+
if (!options.adapters || options.adapters.length === 0) {
|
|
45
|
+
throw new Error('UnifiedWallet requires at least one adapter');
|
|
46
|
+
}
|
|
47
|
+
this.adapters = options.adapters;
|
|
48
|
+
this.strategy = options.strategy ?? 'cheapest';
|
|
49
|
+
this.log = options.logger ?? (() => { });
|
|
50
|
+
this.fallbackIndex = options.fallbackIndex ?? 0;
|
|
51
|
+
this.balanceAggregator = new BalanceAggregator(this.adapters);
|
|
52
|
+
this.chainRouter = new ChainRouter(this.adapters);
|
|
53
|
+
this.intentResolver = new IntentResolver();
|
|
54
|
+
this.sessionManager = new SessionManager();
|
|
55
|
+
}
|
|
56
|
+
// ═══ Core API ═════════════════════════════════════════════════════
|
|
57
|
+
/**
|
|
58
|
+
* Execute a payment using the optimal chain route.
|
|
59
|
+
* The agent simply provides an amount — everything else is automatic.
|
|
60
|
+
*/
|
|
61
|
+
async pay(intent) {
|
|
62
|
+
const strategy = intent.strategy ?? this.strategy;
|
|
63
|
+
this.log(`[Wallet] 💳 Pay intent: $${intent.amount} (strategy: ${strategy})`);
|
|
64
|
+
// Validate intent
|
|
65
|
+
const validation = this.intentResolver.validate(intent);
|
|
66
|
+
if (!validation.valid) {
|
|
67
|
+
return {
|
|
68
|
+
success: false,
|
|
69
|
+
transactionHash: null,
|
|
70
|
+
chain: 'none',
|
|
71
|
+
caip2Id: 'none',
|
|
72
|
+
amountUsd: intent.amount,
|
|
73
|
+
feeUsd: '0',
|
|
74
|
+
error: validation.errors.join('; '),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
// Route to best chain
|
|
78
|
+
const plan = this.chainRouter.getBestPlan(intent, strategy);
|
|
79
|
+
if (!plan) {
|
|
80
|
+
this.log('[Wallet] ❌ No viable route found');
|
|
81
|
+
return {
|
|
82
|
+
success: false,
|
|
83
|
+
transactionHash: null,
|
|
84
|
+
chain: 'none',
|
|
85
|
+
caip2Id: 'none',
|
|
86
|
+
amountUsd: intent.amount,
|
|
87
|
+
feeUsd: '0',
|
|
88
|
+
error: 'No viable payment route found',
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
this.log(`[Wallet] 🔀 Routed to ${plan.chain} (${plan.caip2Id}), fee: $${plan.estimatedFeeUsd}`);
|
|
92
|
+
// Execute payment
|
|
93
|
+
return this.executePlan(plan, intent);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Pay using a natural-language string.
|
|
97
|
+
* @example wallet.payIntent('pay $5 to 0x1234...')
|
|
98
|
+
*/
|
|
99
|
+
async payIntent(intentString) {
|
|
100
|
+
this.log(`[Wallet] 🧠 Resolving intent: "${intentString}"`);
|
|
101
|
+
const intent = this.intentResolver.resolve(intentString);
|
|
102
|
+
return this.pay(intent);
|
|
103
|
+
}
|
|
104
|
+
// ═══ Balance API ══════════════════════════════════════════════════
|
|
105
|
+
/**
|
|
106
|
+
* Get the unified balance across all chains.
|
|
107
|
+
*/
|
|
108
|
+
async getBalance() {
|
|
109
|
+
return this.balanceAggregator.getUnifiedBalance();
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get the total USD balance as a simple number.
|
|
113
|
+
*/
|
|
114
|
+
async getTotalBalanceUsd() {
|
|
115
|
+
const balance = await this.balanceAggregator.getUnifiedBalance();
|
|
116
|
+
return balance.totalUsd;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Check if the wallet has enough funds for a payment.
|
|
120
|
+
*/
|
|
121
|
+
async canAfford(amountUsd) {
|
|
122
|
+
return this.balanceAggregator.hasSufficientFunds(amountUsd);
|
|
123
|
+
}
|
|
124
|
+
// ═══ Routing API ══════════════════════════════════════════════════
|
|
125
|
+
/**
|
|
126
|
+
* Preview all routing options for a payment without executing.
|
|
127
|
+
*/
|
|
128
|
+
previewRoutes(intent) {
|
|
129
|
+
const strategy = intent.strategy ?? this.strategy;
|
|
130
|
+
return this.chainRouter.route(intent, strategy);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get the default routing strategy.
|
|
134
|
+
*/
|
|
135
|
+
getStrategy() {
|
|
136
|
+
return this.strategy;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Change the default routing strategy.
|
|
140
|
+
*/
|
|
141
|
+
setStrategy(strategy) {
|
|
142
|
+
this.strategy = strategy;
|
|
143
|
+
this.log(`[Wallet] ⚙️ Strategy changed to: ${strategy}`);
|
|
144
|
+
}
|
|
145
|
+
// ═══ Session API (EIP-7702 compatible) ════════════════════════════
|
|
146
|
+
/**
|
|
147
|
+
* Create a scoped session for this wallet.
|
|
148
|
+
*/
|
|
149
|
+
createSession(permissions) {
|
|
150
|
+
const session = this.sessionManager.createSession(permissions);
|
|
151
|
+
this.log(`[Wallet] 🔑 Session created: ${session.id} (max: $${permissions.maxTotal})`);
|
|
152
|
+
return session;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Revoke a session.
|
|
156
|
+
*/
|
|
157
|
+
revokeSession(sessionId) {
|
|
158
|
+
const revoked = this.sessionManager.revokeSession(sessionId);
|
|
159
|
+
if (revoked) {
|
|
160
|
+
this.log(`[Wallet] 🚫 Session revoked: ${sessionId}`);
|
|
161
|
+
}
|
|
162
|
+
return revoked;
|
|
163
|
+
}
|
|
164
|
+
// ═══ Adapter Access ═══════════════════════════════════════════════
|
|
165
|
+
/**
|
|
166
|
+
* Get the primary address (first adapter's address).
|
|
167
|
+
*/
|
|
168
|
+
getAddress() {
|
|
169
|
+
return this.adapters[0].getAddress();
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get all adapter addresses.
|
|
173
|
+
*/
|
|
174
|
+
getAddresses() {
|
|
175
|
+
return this.adapters.map((a) => ({
|
|
176
|
+
chain: a.chainName,
|
|
177
|
+
caip2Id: a.caip2Id,
|
|
178
|
+
address: a.getAddress(),
|
|
179
|
+
}));
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get the number of registered adapters.
|
|
183
|
+
*/
|
|
184
|
+
getAdapterCount() {
|
|
185
|
+
return this.adapters.length;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get a specific adapter by CAIP-2 ID.
|
|
189
|
+
*/
|
|
190
|
+
getAdapter(caip2Id) {
|
|
191
|
+
return this.adapters.find((a) => a.caip2Id === caip2Id);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Expose the underlying adapter for EnvoyClient backward compatibility.
|
|
195
|
+
* Returns the first (default) adapter.
|
|
196
|
+
*/
|
|
197
|
+
getDefaultAdapter() {
|
|
198
|
+
return this.adapters[this.fallbackIndex] ?? this.adapters[0];
|
|
199
|
+
}
|
|
200
|
+
// ═══ Internal ═════════════════════════════════════════════════════
|
|
201
|
+
/**
|
|
202
|
+
* Execute a resolved payment plan.
|
|
203
|
+
*/
|
|
204
|
+
async executePlan(plan, intent) {
|
|
205
|
+
const destination = intent.destination ?? plan.adapter.getAddress();
|
|
206
|
+
try {
|
|
207
|
+
const txHash = await plan.adapter.pay(destination, plan.atomicAmount, plan.caip2Id);
|
|
208
|
+
if (txHash) {
|
|
209
|
+
this.log(`[Wallet] ✅ Payment settled on ${plan.chain}: ${txHash}`);
|
|
210
|
+
return {
|
|
211
|
+
success: true,
|
|
212
|
+
transactionHash: txHash,
|
|
213
|
+
chain: plan.chain,
|
|
214
|
+
caip2Id: plan.caip2Id,
|
|
215
|
+
amountUsd: intent.amount,
|
|
216
|
+
feeUsd: plan.estimatedFeeUsd.toFixed(4),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
// Primary route failed — try fallback
|
|
220
|
+
return this.tryFallback(intent, plan.adapterIndex);
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
this.log(`[Wallet] ⚠️ ${plan.chain} failed: ${error.message}`);
|
|
224
|
+
return this.tryFallback(intent, plan.adapterIndex);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Fallback: try next-best adapter if primary fails.
|
|
229
|
+
*/
|
|
230
|
+
async tryFallback(intent, excludeIndex) {
|
|
231
|
+
const strategy = intent.strategy ?? this.strategy;
|
|
232
|
+
const allPlans = this.chainRouter.route(intent, strategy);
|
|
233
|
+
const fallbackPlans = allPlans.filter((p) => p.adapterIndex !== excludeIndex);
|
|
234
|
+
if (fallbackPlans.length === 0) {
|
|
235
|
+
return {
|
|
236
|
+
success: false,
|
|
237
|
+
transactionHash: null,
|
|
238
|
+
chain: 'none',
|
|
239
|
+
caip2Id: 'none',
|
|
240
|
+
amountUsd: intent.amount,
|
|
241
|
+
feeUsd: '0',
|
|
242
|
+
error: 'All payment routes failed',
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
this.log(`[Wallet] 🔄 Falling back to ${fallbackPlans[0].chain}`);
|
|
246
|
+
return this.executePlan(fallbackPlans[0], intent);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=unified-wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified-wallet.js","sourceRoot":"","sources":["../../../src/wallet/unified-wallet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { PaymentAdapter } from './types';
|
|
2
|
+
import { Logger } from '../logger';
|
|
3
|
+
export interface BaseAdapterOptions {
|
|
4
|
+
/** Hex private key (0x-prefixed). If omitted, a random key is generated. */
|
|
5
|
+
privateKey?: `0x${string}`;
|
|
6
|
+
/** 'mainnet' or 'testnet' (default: 'testnet') */
|
|
7
|
+
network?: 'mainnet' | 'testnet';
|
|
8
|
+
/** Optional custom RPC URL */
|
|
9
|
+
rpcUrl?: string;
|
|
10
|
+
/**
|
|
11
|
+
* Asset to settle with.
|
|
12
|
+
* - 'ETH' — native ETH transfer (default)
|
|
13
|
+
* - 'USDC' — ERC-20 USDC transfer via Circle's official contract
|
|
14
|
+
*/
|
|
15
|
+
asset?: 'ETH' | 'USDC';
|
|
16
|
+
/** Optional logger. */
|
|
17
|
+
logger?: Logger;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* BasePaymentAdapter — On-chain settlement on Base (Coinbase L2).
|
|
21
|
+
*
|
|
22
|
+
* Supports both native ETH transfers and USDC (ERC-20) transfers.
|
|
23
|
+
* Uses viem for lightweight, type-safe EVM interactions.
|
|
24
|
+
*
|
|
25
|
+
* Networks:
|
|
26
|
+
* - Base Mainnet (eip155:8453) — production
|
|
27
|
+
* - Base Sepolia (eip155:84532) — testnet
|
|
28
|
+
*
|
|
29
|
+
* @see https://base.org
|
|
30
|
+
* @see https://x402.org
|
|
31
|
+
*/
|
|
32
|
+
export declare class BasePaymentAdapter implements PaymentAdapter {
|
|
33
|
+
readonly chainName = "Base";
|
|
34
|
+
readonly caip2Id: string;
|
|
35
|
+
private wallet;
|
|
36
|
+
private publicClient;
|
|
37
|
+
private account;
|
|
38
|
+
private chain;
|
|
39
|
+
private asset;
|
|
40
|
+
private log;
|
|
41
|
+
constructor(options?: BaseAdapterOptions);
|
|
42
|
+
getAddress(): string;
|
|
43
|
+
/** Get native ETH balance (formatted). */
|
|
44
|
+
getBalance(): Promise<string>;
|
|
45
|
+
/** Get USDC balance (formatted, 6 decimals). */
|
|
46
|
+
getUsdcBalance(): Promise<string>;
|
|
47
|
+
pay(destination: string, amount: string, network: string): Promise<string | null>;
|
|
48
|
+
/** Execute a native ETH transfer. */
|
|
49
|
+
private payEth;
|
|
50
|
+
/** Execute a USDC ERC-20 transfer. */
|
|
51
|
+
private payUsdc;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/adapters/base.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,MAAM,EAAc,MAAM,WAAW,CAAC;AA+B/C,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,UAAU,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC3B,kDAAkD;IAClD,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,SAAgB,SAAS,UAAU;IACnC,SAAgB,OAAO,EAAE,MAAM,CAAC;IAEhC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,GAAG,CAAS;gBAER,OAAO,GAAE,kBAAuB;IAsB5C,UAAU,IAAI,MAAM;IAIpB,0CAA0C;IACpC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAOnC,gDAAgD;IAC1C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAgBjC,GAAG,CACP,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOzB,qCAAqC;YACvB,MAAM;IAuCpB,sCAAsC;YACxB,OAAO;CAkDtB"}
|