rise-wallet 0.1.4-beta.1 → 0.2.28
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/README.md +64 -34
- package/dist/cli/Dialog.d.ts +34 -0
- package/dist/cli/Dialog.js +60 -0
- package/dist/cli/Dialog.js.map +1 -0
- package/dist/cli/Messenger.d.ts +7 -0
- package/dist/cli/Messenger.js +123 -0
- package/dist/cli/Messenger.js.map +1 -0
- package/dist/cli/bin/commands-D7N5ucUu.js +50 -0
- package/dist/cli/bin/index.js +9 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/internal/http.d.ts +6 -0
- package/dist/cli/internal/http.js +17 -0
- package/dist/cli/internal/http.js.map +1 -0
- package/dist/cli/tsdown.config.d.ts +2 -0
- package/dist/cli/tsdown.config.js +28 -0
- package/dist/cli/tsdown.config.js.map +1 -0
- package/dist/core/Chains.d.ts +210 -0
- package/dist/core/Chains.js +20 -0
- package/dist/core/Chains.js.map +1 -0
- package/dist/core/Dialog.d.ts +307 -0
- package/dist/core/Dialog.js +809 -0
- package/dist/core/Dialog.js.map +1 -0
- package/dist/core/Messenger.d.ts +164 -0
- package/dist/core/Messenger.js +207 -0
- package/dist/core/Messenger.js.map +1 -0
- package/dist/core/Mode.d.ts +4 -0
- package/dist/core/Mode.js +5 -0
- package/dist/core/Mode.js.map +1 -0
- package/dist/core/Porto.d.ts +1608 -0
- package/dist/core/Porto.js +105 -0
- package/dist/core/Porto.js.map +1 -0
- package/dist/core/RpcSchema.d.ts +81 -0
- package/dist/core/RpcSchema.js +2 -0
- package/dist/core/RpcSchema.js.map +1 -0
- package/dist/core/Storage.d.ts +14 -0
- package/dist/core/Storage.js +109 -0
- package/dist/core/Storage.js.map +1 -0
- package/dist/core/Transport.d.ts +22 -0
- package/dist/core/Transport.js +37 -0
- package/dist/core/Transport.js.map +1 -0
- package/dist/core/internal/_generated/chains.d.ts +1 -0
- package/dist/core/internal/_generated/chains.js +3 -0
- package/dist/core/internal/_generated/chains.js.map +1 -0
- package/dist/core/internal/_generated/contracts/IthacaAccount.d.ts +1120 -0
- package/dist/core/internal/_generated/contracts/IthacaAccount.js +1453 -0
- package/dist/core/internal/_generated/contracts/IthacaAccount.js.map +1 -0
- package/dist/core/internal/call.d.ts +163 -0
- package/dist/core/internal/call.js +115 -0
- package/dist/core/internal/call.js.map +1 -0
- package/dist/core/internal/erc8010.d.ts +17 -0
- package/dist/core/internal/erc8010.js +29 -0
- package/dist/core/internal/erc8010.js.map +1 -0
- package/dist/core/internal/intersectionObserver.d.ts +1 -0
- package/dist/core/internal/intersectionObserver.js +5 -0
- package/dist/core/internal/intersectionObserver.js.map +1 -0
- package/dist/core/internal/logger.d.ts +21 -0
- package/dist/core/internal/logger.js +24 -0
- package/dist/core/internal/logger.js.map +1 -0
- package/dist/core/internal/mode.d.ts +344 -0
- package/dist/core/internal/mode.js +110 -0
- package/dist/core/internal/mode.js.map +1 -0
- package/dist/core/internal/modes/dialog.d.ts +799 -0
- package/dist/core/internal/modes/dialog.js +760 -0
- package/dist/core/internal/modes/dialog.js.map +1 -0
- package/dist/core/internal/modes/reactNative.d.ts +1401 -0
- package/dist/core/internal/modes/reactNative.js +19 -0
- package/dist/core/internal/modes/reactNative.js.map +1 -0
- package/dist/core/internal/modes/relay.d.ts +684 -0
- package/dist/core/internal/modes/relay.js +708 -0
- package/dist/core/internal/modes/relay.js.map +1 -0
- package/dist/core/internal/permissions.d.ts +59 -0
- package/dist/core/internal/permissions.js +30 -0
- package/dist/core/internal/permissions.js.map +1 -0
- package/dist/core/internal/permissionsRequest.d.ts +71 -0
- package/dist/core/internal/permissionsRequest.js +58 -0
- package/dist/core/internal/permissionsRequest.js.map +1 -0
- package/dist/core/internal/porto.d.ts +13 -0
- package/dist/core/internal/porto.js +2 -0
- package/dist/core/internal/porto.js.map +1 -0
- package/dist/core/internal/promise.d.ts +8 -0
- package/dist/core/internal/promise.js +11 -0
- package/dist/core/internal/promise.js.map +1 -0
- package/dist/core/internal/provider.d.ts +29 -0
- package/dist/core/internal/provider.js +941 -0
- package/dist/core/internal/provider.js.map +1 -0
- package/dist/core/internal/relay/rpcSchema.d.ts +75 -0
- package/dist/core/internal/relay/rpcSchema.js +7 -0
- package/dist/core/internal/relay/rpcSchema.js.map +1 -0
- package/dist/core/internal/relay/schema/capabilities.d.ts +164 -0
- package/dist/core/internal/relay/schema/capabilities.js +112 -0
- package/dist/core/internal/relay/schema/capabilities.js.map +1 -0
- package/dist/core/internal/relay/schema/intent.d.ts +167 -0
- package/dist/core/internal/relay/schema/intent.js +170 -0
- package/dist/core/internal/relay/schema/intent.js.map +1 -0
- package/dist/core/internal/relay/schema/key.d.ts +43 -0
- package/dist/core/internal/relay/schema/key.js +30 -0
- package/dist/core/internal/relay/schema/key.js.map +1 -0
- package/dist/core/internal/relay/schema/permission.d.ts +39 -0
- package/dist/core/internal/relay/schema/permission.js +29 -0
- package/dist/core/internal/relay/schema/permission.js.map +1 -0
- package/dist/core/internal/relay/schema/preCall.d.ts +62 -0
- package/dist/core/internal/relay/schema/preCall.js +36 -0
- package/dist/core/internal/relay/schema/preCall.js.map +1 -0
- package/dist/core/internal/relay/schema/quotes.d.ts +369 -0
- package/dist/core/internal/relay/schema/quotes.js +89 -0
- package/dist/core/internal/relay/schema/quotes.js.map +1 -0
- package/dist/core/internal/relay/schema/rpc.d.ts +1528 -0
- package/dist/core/internal/relay/schema/rpc.js +638 -0
- package/dist/core/internal/relay/schema/rpc.js.map +1 -0
- package/dist/core/internal/relay/schema/token.d.ts +13 -0
- package/dist/core/internal/relay/schema/token.js +13 -0
- package/dist/core/internal/relay/schema/token.js.map +1 -0
- package/dist/core/internal/requiredFunds.d.ts +18 -0
- package/dist/core/internal/requiredFunds.js +25 -0
- package/dist/core/internal/requiredFunds.js.map +1 -0
- package/dist/core/internal/schema/capabilities.d.ts +313 -0
- package/dist/core/internal/schema/capabilities.js +133 -0
- package/dist/core/internal/schema/capabilities.js.map +1 -0
- package/dist/core/internal/schema/key.d.ts +164 -0
- package/dist/core/internal/schema/key.js +75 -0
- package/dist/core/internal/schema/key.js.map +1 -0
- package/dist/core/internal/schema/permissions.d.ts +102 -0
- package/dist/core/internal/schema/permissions.js +28 -0
- package/dist/core/internal/schema/permissions.js.map +1 -0
- package/dist/core/internal/schema/request.d.ts +937 -0
- package/dist/core/internal/schema/request.js +57 -0
- package/dist/core/internal/schema/request.js.map +1 -0
- package/dist/core/internal/schema/rpc.d.ts +3314 -0
- package/dist/core/internal/schema/rpc.js +599 -0
- package/dist/core/internal/schema/rpc.js.map +1 -0
- package/dist/core/internal/schema/token.d.ts +1 -0
- package/dist/core/internal/schema/token.js +2 -0
- package/dist/core/internal/schema/token.js.map +1 -0
- package/dist/core/internal/schema/utils.d.ts +18 -0
- package/dist/core/internal/schema/utils.js +213 -0
- package/dist/core/internal/schema/utils.js.map +1 -0
- package/dist/core/internal/siwe.d.ts +32 -0
- package/dist/core/internal/siwe.js +92 -0
- package/dist/core/internal/siwe.js.map +1 -0
- package/dist/core/internal/store.d.ts +2 -0
- package/dist/core/internal/store.js +9 -0
- package/dist/core/internal/store.js.map +1 -0
- package/dist/core/internal/tokens.d.ts +57 -0
- package/dist/core/internal/tokens.js +69 -0
- package/dist/core/internal/tokens.js.map +1 -0
- package/dist/core/internal/types.d.ts +298 -0
- package/dist/core/internal/types.js +2 -0
- package/dist/core/internal/types.js.map +1 -0
- package/dist/core/internal/urlString.d.ts +1 -0
- package/dist/core/internal/urlString.js +8 -0
- package/dist/core/internal/urlString.js.map +1 -0
- package/dist/core/internal/userAgent.d.ts +10 -0
- package/dist/core/internal/userAgent.js +19 -0
- package/dist/core/internal/userAgent.js.map +1 -0
- package/dist/core/internal/utils.d.ts +24 -0
- package/dist/core/internal/utils.js +62 -0
- package/dist/core/internal/utils.js.map +1 -0
- package/dist/core/react-native/Porto.d.ts +1480 -0
- package/dist/core/react-native/Porto.js +17 -0
- package/dist/core/react-native/Porto.js.map +1 -0
- package/dist/core/react-native/configure.d.ts +9 -0
- package/dist/core/react-native/configure.js +24 -0
- package/dist/core/react-native/configure.js.map +1 -0
- package/dist/core/react-native/environment.d.ts +26 -0
- package/dist/core/react-native/environment.js +13 -0
- package/dist/core/react-native/environment.js.map +1 -0
- package/dist/core/react-native/index.d.ts +4 -0
- package/dist/core/react-native/index.js +5 -0
- package/dist/core/react-native/index.js.map +1 -0
- package/dist/core/react-native/utils.d.ts +1 -0
- package/dist/core/react-native/utils.js +12 -0
- package/dist/core/react-native/utils.js.map +1 -0
- package/dist/index.d.ts +16 -2
- package/dist/index.js +15 -2
- package/dist/index.js.map +1 -0
- package/dist/internal/index.d.ts +3 -0
- package/dist/internal/index.js +4 -0
- package/dist/internal/index.js.map +1 -0
- package/dist/react-native/crypto.d.ts +1 -0
- package/dist/react-native/crypto.js +12 -0
- package/dist/react-native/crypto.js.map +1 -0
- package/dist/react-native/index.d.ts +7 -0
- package/dist/react-native/index.js +12 -0
- package/dist/react-native/index.js.map +1 -0
- package/dist/react-native/register.d.ts +2 -0
- package/dist/react-native/register.js +15 -0
- package/dist/react-native/register.js.map +1 -0
- package/dist/register/index.d.ts +14 -0
- package/dist/register/index.js +2 -0
- package/dist/register/index.js.map +1 -0
- package/dist/remote/Actions.d.ts +33 -0
- package/dist/remote/Actions.js +76 -0
- package/dist/remote/Actions.js.map +1 -0
- package/dist/remote/Events.d.ts +46 -0
- package/dist/remote/Events.js +132 -0
- package/dist/remote/Events.js.map +1 -0
- package/dist/remote/Hooks.d.ts +3800 -0
- package/dist/remote/Hooks.js +106 -0
- package/dist/remote/Hooks.js.map +1 -0
- package/dist/remote/Porto.d.ts +857 -0
- package/dist/remote/Porto.js +66 -0
- package/dist/remote/Porto.js.map +1 -0
- package/dist/remote/index.d.ts +4 -0
- package/dist/remote/index.js +5 -0
- package/dist/remote/index.js.map +1 -0
- package/dist/remote/internal/methodPolicies.d.ts +96 -0
- package/dist/remote/internal/methodPolicies.js +102 -0
- package/dist/remote/internal/methodPolicies.js.map +1 -0
- package/dist/server/Route.d.ts +87 -0
- package/dist/server/Route.js +189 -0
- package/dist/server/Route.js.map +1 -0
- package/dist/server/Router.d.ts +23 -0
- package/dist/server/Router.js +29 -0
- package/dist/server/Router.js.map +1 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.js +3 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/internal/merchantSchema.d.ts +64 -0
- package/dist/server/internal/merchantSchema.js +7 -0
- package/dist/server/internal/merchantSchema.js.map +1 -0
- package/dist/server/internal/requestListener.d.ts +123 -0
- package/dist/server/internal/requestListener.js +172 -0
- package/dist/server/internal/requestListener.js.map +1 -0
- package/dist/theme/Theme.d.ts +121 -0
- package/dist/theme/Theme.js +18 -0
- package/dist/theme/Theme.js.map +1 -0
- package/dist/theme/index.d.ts +2 -0
- package/dist/theme/index.js +2 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/trusted-hosts.d.ts +1 -0
- package/dist/trusted-hosts.js +41 -0
- package/dist/trusted-hosts.js.map +1 -0
- package/dist/viem/Account.d.ts +110 -0
- package/dist/viem/Account.js +132 -0
- package/dist/viem/Account.js.map +1 -0
- package/dist/viem/AccountActions.d.ts +10 -0
- package/dist/viem/AccountActions.js +14 -0
- package/dist/viem/AccountActions.js.map +1 -0
- package/dist/viem/CapabilitiesSchema.d.ts +14 -0
- package/dist/viem/CapabilitiesSchema.js +2 -0
- package/dist/viem/CapabilitiesSchema.js.map +1 -0
- package/dist/viem/ContractActions.d.ts +208 -0
- package/dist/viem/ContractActions.js +350 -0
- package/dist/viem/ContractActions.js.map +1 -0
- package/dist/viem/Key.d.ts +1155 -0
- package/dist/viem/Key.js +924 -0
- package/dist/viem/Key.js.map +1 -0
- package/dist/viem/RelayActions.d.ts +435 -0
- package/dist/viem/RelayActions.js +385 -0
- package/dist/viem/RelayActions.js.map +1 -0
- package/dist/viem/RelayClient.d.ts +26 -0
- package/dist/viem/RelayClient.js +44 -0
- package/dist/viem/RelayClient.js.map +1 -0
- package/dist/viem/RpcSchema.d.ts +22 -0
- package/dist/viem/RpcSchema.js +2 -0
- package/dist/viem/RpcSchema.js.map +1 -0
- package/dist/viem/WalletActions.d.ts +86 -0
- package/dist/viem/WalletActions.js +220 -0
- package/dist/viem/WalletActions.js.map +1 -0
- package/dist/viem/WalletClient.d.ts +20 -0
- package/dist/viem/WalletClient.js +23 -0
- package/dist/viem/WalletClient.js.map +1 -0
- package/dist/viem/index.d.ts +13 -0
- package/dist/viem/index.js +12 -0
- package/dist/viem/index.js.map +1 -0
- package/dist/viem/internal/relayActions.d.ts +364 -0
- package/dist/viem/internal/relayActions.js +783 -0
- package/dist/viem/internal/relayActions.js.map +1 -0
- package/dist/viem/internal/utils.d.ts +15 -0
- package/dist/viem/internal/utils.js +2 -0
- package/dist/viem/internal/utils.js.map +1 -0
- package/dist/wagmi/Actions.d.ts +1 -0
- package/dist/wagmi/Actions.js +2 -0
- package/dist/wagmi/Actions.js.map +1 -0
- package/dist/wagmi/Connector.d.ts +26 -0
- package/dist/wagmi/Connector.js +238 -0
- package/dist/wagmi/Connector.js.map +1 -0
- package/dist/wagmi/Hooks.d.ts +1 -0
- package/dist/wagmi/Hooks.js +2 -0
- package/dist/wagmi/Hooks.js.map +1 -0
- package/dist/wagmi/Query.d.ts +1 -0
- package/dist/wagmi/Query.js +2 -0
- package/dist/wagmi/Query.js.map +1 -0
- package/dist/wagmi/index.d.ts +4 -0
- package/dist/wagmi/index.js +5 -0
- package/dist/wagmi/index.js.map +1 -0
- package/dist/wagmi/internal/core.d.ts +83 -0
- package/dist/wagmi/internal/core.js +229 -0
- package/dist/wagmi/internal/core.js.map +1 -0
- package/dist/wagmi/internal/query.d.ts +32 -0
- package/dist/wagmi/internal/query.js +23 -0
- package/dist/wagmi/internal/query.js.map +1 -0
- package/dist/wagmi/internal/react.d.ts +90 -0
- package/dist/wagmi/internal/react.js +256 -0
- package/dist/wagmi/internal/react.js.map +1 -0
- package/dist/wagmi/internal/types.d.ts +10 -0
- package/dist/wagmi/internal/types.js +2 -0
- package/dist/wagmi/internal/types.js.map +1 -0
- package/dist/wagmi/internal/utils.d.ts +1 -0
- package/dist/wagmi/internal/utils.js +18 -0
- package/dist/wagmi/internal/utils.js.map +1 -0
- package/package.json +286 -34
- package/src/cli/Dialog.ts +75 -0
- package/src/cli/Messenger.ts +148 -0
- package/src/cli/bin/index.ts +37 -0
- package/src/cli/bin/tsconfig.json +8 -0
- package/src/cli/index.ts +2 -0
- package/src/cli/internal/commands.ts +212 -0
- package/src/cli/internal/context.ts +56 -0
- package/src/cli/internal/http.ts +28 -0
- package/src/cli/internal/utils.ts +28 -0
- package/src/cli/tsdown.config.ts +37 -0
- package/src/core/Chains.ts +25 -0
- package/src/core/Dialog.ts +1059 -0
- package/src/core/Messenger.ts +394 -0
- package/src/core/Mode.ts +4 -0
- package/src/core/Porto.ts +287 -0
- package/src/core/RpcSchema.ts +124 -0
- package/src/core/Storage.ts +122 -0
- package/src/core/Transport.ts +45 -0
- package/src/core/internal/_generated/chains.ts +2 -0
- package/src/core/internal/_generated/contracts/EIP7702Proxy.ts +25 -0
- package/src/core/internal/_generated/contracts/Escrow.ts +330 -0
- package/src/core/internal/_generated/contracts/ExperimentERC20.ts +569 -0
- package/src/core/internal/_generated/contracts/ExperimentERC721.ts +588 -0
- package/src/core/internal/_generated/contracts/GuardedExecutor.ts +623 -0
- package/src/core/internal/_generated/contracts/ICallChecker.ts +34 -0
- package/src/core/internal/_generated/contracts/ICommon.ts +4 -0
- package/src/core/internal/_generated/contracts/IEscrow.ts +114 -0
- package/src/core/internal/_generated/contracts/IFunder.ts +80 -0
- package/src/core/internal/_generated/contracts/IFunderV4.ts +45 -0
- package/src/core/internal/_generated/contracts/IIthacaAccount.ts +107 -0
- package/src/core/internal/_generated/contracts/IOAppCore.ts +142 -0
- package/src/core/internal/_generated/contracts/IOAppMsgInspector.ts +45 -0
- package/src/core/internal/_generated/contracts/IOAppReceiver.ts +161 -0
- package/src/core/internal/_generated/contracts/IOrchestrator.ts +95 -0
- package/src/core/internal/_generated/contracts/ISettler.ts +52 -0
- package/src/core/internal/_generated/contracts/ISigner.ts +34 -0
- package/src/core/internal/_generated/contracts/IthacaAccount.ts +1454 -0
- package/src/core/internal/_generated/contracts/IthacaAccountNew.ts +1454 -0
- package/src/core/internal/_generated/contracts/IthacaAccountOld.ts +1454 -0
- package/src/core/internal/_generated/contracts/LayerZeroSettler.ts +811 -0
- package/src/core/internal/_generated/contracts/LibNonce.ts +15 -0
- package/src/core/internal/_generated/contracts/LibTStack.ts +4 -0
- package/src/core/internal/_generated/contracts/MultiSigSigner.ts +203 -0
- package/src/core/internal/_generated/contracts/OApp.ts +412 -0
- package/src/core/internal/_generated/contracts/OAppCore.ts +229 -0
- package/src/core/internal/_generated/contracts/OAppReceiver.ts +396 -0
- package/src/core/internal/_generated/contracts/OAppSender.ts +245 -0
- package/src/core/internal/_generated/contracts/Orchestrator.ts +390 -0
- package/src/core/internal/_generated/contracts/SimpleFunder.ts +534 -0
- package/src/core/internal/_generated/contracts/SimpleSettler.ts +360 -0
- package/src/core/internal/_generated/contracts/Simulator.ts +170 -0
- package/src/core/internal/_generated/contracts/TokenTransferLib.ts +4 -0
- package/src/core/internal/_snapshots/provider.browser.test.ts.snap +119 -0
- package/src/core/internal/_snapshots/provider.test.ts.snap +1103 -0
- package/src/core/internal/call.test.ts +116 -0
- package/src/core/internal/call.ts +245 -0
- package/src/core/internal/erc8010.test.ts +74 -0
- package/src/core/internal/erc8010.ts +44 -0
- package/src/core/internal/intersectionObserver.ts +5 -0
- package/src/core/internal/logger.ts +42 -0
- package/src/core/internal/mode.ts +498 -0
- package/src/core/internal/modes/dialog.ts +1051 -0
- package/src/core/internal/modes/reactNative.ts +29 -0
- package/src/core/internal/modes/relay.ts +893 -0
- package/src/core/internal/permissions.ts +43 -0
- package/src/core/internal/permissionsRequest.ts +88 -0
- package/src/core/internal/porto.ts +16 -0
- package/src/core/internal/promise.ts +19 -0
- package/src/core/internal/provider.browser.test.ts +311 -0
- package/src/core/internal/provider.test.ts +3552 -0
- package/src/core/internal/provider.ts +1277 -0
- package/src/core/internal/relay/rpcSchema.ts +101 -0
- package/src/core/internal/relay/schema/capabilities.test.ts +663 -0
- package/src/core/internal/relay/schema/capabilities.ts +156 -0
- package/src/core/internal/relay/schema/intent.test.ts +433 -0
- package/src/core/internal/relay/schema/intent.ts +174 -0
- package/src/core/internal/relay/schema/key.test.ts +424 -0
- package/src/core/internal/relay/schema/key.ts +34 -0
- package/src/core/internal/relay/schema/permission.test.ts +499 -0
- package/src/core/internal/relay/schema/permission.ts +34 -0
- package/src/core/internal/relay/schema/preCall.ts +39 -0
- package/src/core/internal/relay/schema/quotes.test.ts +901 -0
- package/src/core/internal/relay/schema/quotes.ts +98 -0
- package/src/core/internal/relay/schema/rpc.ts +822 -0
- package/src/core/internal/relay/schema/token.ts +16 -0
- package/src/core/internal/requiredFunds.test.ts +141 -0
- package/src/core/internal/requiredFunds.ts +45 -0
- package/src/core/internal/schema/capabilities.test.ts +1334 -0
- package/src/core/internal/schema/capabilities.ts +162 -0
- package/src/core/internal/schema/key.test.ts +570 -0
- package/src/core/internal/schema/key.ts +98 -0
- package/src/core/internal/schema/permissions.test.ts +948 -0
- package/src/core/internal/schema/permissions.ts +31 -0
- package/src/core/internal/schema/request.bench.ts +35 -0
- package/src/core/internal/schema/request.ts +90 -0
- package/src/core/internal/schema/rpc.ts +821 -0
- package/src/core/internal/schema/token.ts +1 -0
- package/src/core/internal/schema/utils.test.ts +572 -0
- package/src/core/internal/schema/utils.ts +236 -0
- package/src/core/internal/siwe.test.ts +473 -0
- package/src/core/internal/siwe.ts +144 -0
- package/src/core/internal/store.ts +9 -0
- package/src/core/internal/tokens.test.ts +317 -0
- package/src/core/internal/tokens.ts +125 -0
- package/src/core/internal/types.ts +448 -0
- package/src/core/internal/urlString.ts +5 -0
- package/src/core/internal/userAgent.ts +35 -0
- package/src/core/internal/utils.test.ts +35 -0
- package/src/core/internal/utils.ts +67 -0
- package/src/core/react-native/Porto.ts +22 -0
- package/src/core/react-native/configure.ts +31 -0
- package/src/core/react-native/environment.ts +43 -0
- package/src/core/react-native/index.ts +4 -0
- package/src/core/react-native/utils.ts +18 -0
- package/src/index.ts +17 -0
- package/src/internal/index.ts +3 -0
- package/src/react-native/crypto.ts +19 -0
- package/src/react-native/index.ts +15 -0
- package/src/react-native/register.ts +24 -0
- package/src/register/index.ts +17 -0
- package/src/remote/Actions.ts +115 -0
- package/src/remote/Events.ts +193 -0
- package/src/remote/Hooks.ts +194 -0
- package/src/remote/Porto.ts +144 -0
- package/src/remote/index.ts +4 -0
- package/src/remote/internal/methodPolicies.ts +124 -0
- package/src/server/Route.test.ts +347 -0
- package/src/server/Route.ts +259 -0
- package/src/server/Router.test.ts +32 -0
- package/src/server/Router.ts +59 -0
- package/src/server/index.ts +2 -0
- package/src/server/internal/merchantSchema.ts +11 -0
- package/src/server/internal/requestListener.ts +284 -0
- package/src/theme/Theme.ts +163 -0
- package/src/theme/index.ts +2 -0
- package/src/trusted-hosts.ts +40 -0
- package/src/tsconfig.build.tsbuildinfo +1 -0
- package/src/tsconfig.json +15 -0
- package/src/viem/Account.test.ts +270 -0
- package/src/viem/Account.ts +278 -0
- package/src/viem/AccountActions.test.ts +3 -0
- package/src/viem/AccountActions.ts +30 -0
- package/src/viem/CapabilitiesSchema.ts +18 -0
- package/src/viem/ContractActions.test.ts +980 -0
- package/src/viem/ContractActions.ts +624 -0
- package/src/viem/Key.test.ts +1420 -0
- package/src/viem/Key.ts +1318 -0
- package/src/viem/RelayActions.test.ts +1730 -0
- package/src/viem/RelayActions.ts +1082 -0
- package/src/viem/RelayClient.test.ts +127 -0
- package/src/viem/RelayClient.ts +87 -0
- package/src/viem/RpcSchema.ts +27 -0
- package/src/viem/WalletActions.test.ts +646 -0
- package/src/viem/WalletActions.ts +476 -0
- package/src/viem/WalletClient.test.ts +36 -0
- package/src/viem/WalletClient.ts +74 -0
- package/src/viem/index.ts +13 -0
- package/src/viem/internal/relayActions.test.ts +1296 -0
- package/src/viem/internal/relayActions.ts +1222 -0
- package/src/viem/internal/utils.ts +27 -0
- package/src/wagmi/Actions.ts +13 -0
- package/src/wagmi/Connector.ts +304 -0
- package/src/wagmi/Hooks.ts +14 -0
- package/src/wagmi/Query.ts +5 -0
- package/src/wagmi/index.ts +4 -0
- package/src/wagmi/internal/core.test.ts +12 -0
- package/src/wagmi/internal/core.ts +468 -0
- package/src/wagmi/internal/query.ts +52 -0
- package/src/wagmi/internal/react.test.ts +12 -0
- package/src/wagmi/internal/react.ts +705 -0
- package/src/wagmi/internal/types.ts +21 -0
- package/src/wagmi/internal/utils.ts +25 -0
- package/dist/chain.cjs +0 -17
- package/dist/chain.d.cts +0 -41
- package/dist/chain.d.ts +0 -41
- package/dist/chain.js +0 -13
- package/dist/config.cjs +0 -19
- package/dist/config.d.cts +0 -3
- package/dist/config.d.ts +0 -3
- package/dist/config.js +0 -16
- package/dist/index.cjs +0 -18
- package/dist/index.d.cts +0 -2
package/dist/viem/Key.js
ADDED
|
@@ -0,0 +1,924 @@
|
|
|
1
|
+
import * as AbiFunction from 'ox/AbiFunction';
|
|
2
|
+
import * as AbiParameters from 'ox/AbiParameters';
|
|
3
|
+
import * as Address from 'ox/Address';
|
|
4
|
+
import * as Bytes from 'ox/Bytes';
|
|
5
|
+
import * as Hash from 'ox/Hash';
|
|
6
|
+
import * as Hex from 'ox/Hex';
|
|
7
|
+
import * as Json from 'ox/Json';
|
|
8
|
+
import * as P256 from 'ox/P256';
|
|
9
|
+
import * as PublicKey from 'ox/PublicKey';
|
|
10
|
+
import * as Secp256k1 from 'ox/Secp256k1';
|
|
11
|
+
import * as Signature from 'ox/Signature';
|
|
12
|
+
import * as TypedData from 'ox/TypedData';
|
|
13
|
+
import * as Value from 'ox/Value';
|
|
14
|
+
import * as WebAuthnP256 from 'ox/WebAuthnP256';
|
|
15
|
+
import * as WebCryptoP256 from 'ox/WebCryptoP256';
|
|
16
|
+
import { zeroAddress } from 'viem';
|
|
17
|
+
import * as Call from "../core/internal/call.js";
|
|
18
|
+
/** Relay key type to key type mapping. */
|
|
19
|
+
export const fromRelayKeyType = {
|
|
20
|
+
p256: 'p256',
|
|
21
|
+
secp256k1: 'secp256k1',
|
|
22
|
+
webauthnp256: 'webauthn-p256',
|
|
23
|
+
};
|
|
24
|
+
/** Relay key role to key role mapping. */
|
|
25
|
+
export const fromRelayKeyRole = {
|
|
26
|
+
admin: 'admin',
|
|
27
|
+
normal: 'session',
|
|
28
|
+
};
|
|
29
|
+
/** Serialized (contract-compatible) key type to key type mapping. */
|
|
30
|
+
export const fromSerializedKeyType = {
|
|
31
|
+
0: 'p256',
|
|
32
|
+
1: 'webauthn-p256',
|
|
33
|
+
2: 'secp256k1',
|
|
34
|
+
};
|
|
35
|
+
/** Serialized (contract-compatible) spend period to period mapping. */
|
|
36
|
+
export const fromSerializedSpendPeriod = {
|
|
37
|
+
0: 'minute',
|
|
38
|
+
1: 'hour',
|
|
39
|
+
2: 'day',
|
|
40
|
+
3: 'week',
|
|
41
|
+
4: 'month',
|
|
42
|
+
5: 'year',
|
|
43
|
+
};
|
|
44
|
+
/** Key type to Relay key type mapping. */
|
|
45
|
+
export const toRelayKeyType = {
|
|
46
|
+
address: 'secp256k1',
|
|
47
|
+
p256: 'p256',
|
|
48
|
+
secp256k1: 'secp256k1',
|
|
49
|
+
'webauthn-p256': 'webauthnp256',
|
|
50
|
+
};
|
|
51
|
+
/** Key role to Relay key role mapping. */
|
|
52
|
+
export const toRelayKeyRole = {
|
|
53
|
+
admin: 'admin',
|
|
54
|
+
session: 'normal',
|
|
55
|
+
};
|
|
56
|
+
/** Key type to serialized (contract-compatible) key type mapping. */
|
|
57
|
+
export const toSerializedKeyType = {
|
|
58
|
+
address: 2,
|
|
59
|
+
p256: 0,
|
|
60
|
+
secp256k1: 2,
|
|
61
|
+
'webauthn-p256': 1,
|
|
62
|
+
};
|
|
63
|
+
/** Period to serialized (contract-compatible) spend period mapping. */
|
|
64
|
+
export const toSerializedSpendPeriod = {
|
|
65
|
+
day: 2,
|
|
66
|
+
hour: 1,
|
|
67
|
+
minute: 0,
|
|
68
|
+
month: 4,
|
|
69
|
+
week: 3,
|
|
70
|
+
year: 5,
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Creates a random P256 key.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* import * as Key from './key.js'
|
|
78
|
+
*
|
|
79
|
+
* // Admin Key
|
|
80
|
+
* const key = Key.createP256()
|
|
81
|
+
*
|
|
82
|
+
* // Session Key
|
|
83
|
+
* const key = Key.createP256({
|
|
84
|
+
* expiry: 1714857600,
|
|
85
|
+
* role: 'session',
|
|
86
|
+
* })
|
|
87
|
+
* ```
|
|
88
|
+
*
|
|
89
|
+
* @param parameters - Key parameters.
|
|
90
|
+
* @returns P256 key.
|
|
91
|
+
*/
|
|
92
|
+
export function createP256(parameters = {}) {
|
|
93
|
+
const privateKey = P256.randomPrivateKey();
|
|
94
|
+
return fromP256({
|
|
95
|
+
...parameters,
|
|
96
|
+
privateKey,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Creates a random Secp256k1 key.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```ts
|
|
104
|
+
* import * as Key from './key.js'
|
|
105
|
+
*
|
|
106
|
+
* // Admin Key
|
|
107
|
+
* const key = Key.createSecp256k1()
|
|
108
|
+
*
|
|
109
|
+
* // Session Key
|
|
110
|
+
* const key = Key.createSecp256k1({
|
|
111
|
+
* expiry: 1714857600,
|
|
112
|
+
* role: 'session',
|
|
113
|
+
* })
|
|
114
|
+
* ```
|
|
115
|
+
*
|
|
116
|
+
* @param parameters - Key parameters.
|
|
117
|
+
* @returns Secp256k1 key.
|
|
118
|
+
*/
|
|
119
|
+
export function createSecp256k1(parameters = {}) {
|
|
120
|
+
const privateKey = Secp256k1.randomPrivateKey();
|
|
121
|
+
return fromSecp256k1({
|
|
122
|
+
...parameters,
|
|
123
|
+
privateKey,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Creates a WebAuthnP256 key.
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* ```ts
|
|
131
|
+
* import { Bytes } from 'ox'
|
|
132
|
+
* import * as Key from './key.js'
|
|
133
|
+
*
|
|
134
|
+
* // Admin Key
|
|
135
|
+
* const key = Key.createWebAuthnP256({
|
|
136
|
+
* label: 'My Key',
|
|
137
|
+
* userId: Bytes.from('0x0000000000000000000000000000000000000000'),
|
|
138
|
+
* })
|
|
139
|
+
*
|
|
140
|
+
* // Session Key
|
|
141
|
+
* const key = Key.createWebAuthnP256({
|
|
142
|
+
* expiry: 1714857600,
|
|
143
|
+
* label: 'My Key',
|
|
144
|
+
* role: 'session',
|
|
145
|
+
* userId: Bytes.from('0x0000000000000000000000000000000000000000'),
|
|
146
|
+
* })
|
|
147
|
+
* ```
|
|
148
|
+
*
|
|
149
|
+
* @param parameters - Key parameters.
|
|
150
|
+
* @returns WebAuthnP256 key.
|
|
151
|
+
*/
|
|
152
|
+
export async function createWebAuthnP256(parameters) {
|
|
153
|
+
const { createFn, label, rpId, userId } = parameters;
|
|
154
|
+
const credential = await WebAuthnP256.createCredential({
|
|
155
|
+
authenticatorSelection: {
|
|
156
|
+
requireResidentKey: true,
|
|
157
|
+
residentKey: 'required',
|
|
158
|
+
userVerification: 'required',
|
|
159
|
+
},
|
|
160
|
+
createFn,
|
|
161
|
+
extensions: {
|
|
162
|
+
credProps: true,
|
|
163
|
+
},
|
|
164
|
+
rp: rpId
|
|
165
|
+
? {
|
|
166
|
+
id: rpId,
|
|
167
|
+
name: rpId,
|
|
168
|
+
}
|
|
169
|
+
: undefined,
|
|
170
|
+
user: {
|
|
171
|
+
displayName: label,
|
|
172
|
+
id: new Uint8Array(userId ?? Bytes.fromString(label)),
|
|
173
|
+
name: label,
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
return fromWebAuthnP256({
|
|
177
|
+
...parameters,
|
|
178
|
+
credential: {
|
|
179
|
+
id: credential.id,
|
|
180
|
+
publicKey: credential.publicKey,
|
|
181
|
+
},
|
|
182
|
+
id: userId
|
|
183
|
+
? Bytes.toHex(userId)
|
|
184
|
+
: PublicKey.toHex(credential.publicKey, {
|
|
185
|
+
includePrefix: false,
|
|
186
|
+
}),
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Creates a random WebAuthn-wrapped P256 key.
|
|
191
|
+
*
|
|
192
|
+
* @example
|
|
193
|
+
* ```ts
|
|
194
|
+
* import * as Key from './key.js'
|
|
195
|
+
*
|
|
196
|
+
* // Admin Key
|
|
197
|
+
* const key = Key.createHeadlessWebAuthnP256()
|
|
198
|
+
*
|
|
199
|
+
* // Session Key
|
|
200
|
+
* const key = Key.createHeadlessWebAuthnP256({
|
|
201
|
+
* expiry: 1714857600,
|
|
202
|
+
* role: 'session',
|
|
203
|
+
* })
|
|
204
|
+
* ```
|
|
205
|
+
*
|
|
206
|
+
* @param parameters - Key parameters.
|
|
207
|
+
* @returns P256 key.
|
|
208
|
+
*/
|
|
209
|
+
export function createHeadlessWebAuthnP256(parameters = {}) {
|
|
210
|
+
const privateKey = P256.randomPrivateKey();
|
|
211
|
+
return fromHeadlessWebAuthnP256({
|
|
212
|
+
...parameters,
|
|
213
|
+
privateKey,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Creates a random WebCryptoP256 key.
|
|
218
|
+
*
|
|
219
|
+
* @example
|
|
220
|
+
* ```ts
|
|
221
|
+
* import * as Key from './key.js'
|
|
222
|
+
*
|
|
223
|
+
* // Admin Key
|
|
224
|
+
* const key = Key.createWebCryptoP256()
|
|
225
|
+
*
|
|
226
|
+
* // Session Key
|
|
227
|
+
* const key = Key.createWebCryptoP256({
|
|
228
|
+
* expiry: 1714857600,
|
|
229
|
+
* role: 'session',
|
|
230
|
+
* })
|
|
231
|
+
* ```
|
|
232
|
+
*
|
|
233
|
+
* @param parameters - Key parameters.
|
|
234
|
+
* @returns WebCryptoP256 key.
|
|
235
|
+
*/
|
|
236
|
+
export async function createWebCryptoP256(parameters = {}) {
|
|
237
|
+
const keyPair = await WebCryptoP256.createKeyPair();
|
|
238
|
+
return fromWebCryptoP256({
|
|
239
|
+
...parameters,
|
|
240
|
+
keyPair,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Deserializes a key from its serialized format.
|
|
245
|
+
*
|
|
246
|
+
* @example
|
|
247
|
+
* ```ts
|
|
248
|
+
* import * as Key from './key.js'
|
|
249
|
+
*
|
|
250
|
+
* const key = Key.deserialize({
|
|
251
|
+
* expiry: 0,
|
|
252
|
+
* isSuperAdmin: false,
|
|
253
|
+
* keyType: 0,
|
|
254
|
+
* publicKey: '0x04ec0effa5f2f378cbf7fd2fa7ca1e8dc51cf777c129fa1c00a0e9a9205f2e511ff3f20b34a4e0b50587d055c0e0fad33d32cf1147d3bb2538fbab0d15d8e65008',
|
|
255
|
+
* })
|
|
256
|
+
* ```
|
|
257
|
+
*
|
|
258
|
+
* @param serialized - Serialized key.
|
|
259
|
+
* @returns Key.
|
|
260
|
+
*/
|
|
261
|
+
export function deserialize(serialized, options = {}) {
|
|
262
|
+
const { chainId } = options;
|
|
263
|
+
const publicKey = serialized.publicKey;
|
|
264
|
+
const type = fromSerializedKeyType[serialized.keyType];
|
|
265
|
+
return from({
|
|
266
|
+
chainId,
|
|
267
|
+
expiry: serialized.expiry,
|
|
268
|
+
publicKey,
|
|
269
|
+
role: serialized.isSuperAdmin ? 'admin' : 'session',
|
|
270
|
+
type,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Instantiates a key from its parameters.
|
|
275
|
+
*
|
|
276
|
+
* @example
|
|
277
|
+
* ```ts
|
|
278
|
+
* import { P256 } from 'ox'
|
|
279
|
+
* import * as Key from './key.js'
|
|
280
|
+
*
|
|
281
|
+
* const privateKey = P256.randomPrivateKey()
|
|
282
|
+
* const publicKey = P256.getPublicKey({ privateKey })
|
|
283
|
+
*
|
|
284
|
+
* const key = Key.from({
|
|
285
|
+
* expiry: 0,
|
|
286
|
+
* publicKey,
|
|
287
|
+
* async sign({ payload }) {
|
|
288
|
+
* return P256.sign({ payload, privateKey })
|
|
289
|
+
* },
|
|
290
|
+
* type: 'p256',
|
|
291
|
+
* })
|
|
292
|
+
* ```
|
|
293
|
+
*
|
|
294
|
+
* @param key - Key.
|
|
295
|
+
* @returns Key.
|
|
296
|
+
*/
|
|
297
|
+
export function from(key, options = {}) {
|
|
298
|
+
const { chainId = key.chainId } = options;
|
|
299
|
+
const { expiry = 0, id, prehash = false, role = 'admin', type } = key;
|
|
300
|
+
const publicKey = (() => {
|
|
301
|
+
const publicKey = key.publicKey;
|
|
302
|
+
if (publicKey === '0x')
|
|
303
|
+
return publicKey;
|
|
304
|
+
if (type === 'secp256k1' || type === 'address') {
|
|
305
|
+
const isAddress = Hex.size(publicKey) === 20 ||
|
|
306
|
+
Hex.toBigInt(Hex.slice(publicKey, 0, 12)) === 0n;
|
|
307
|
+
const address = isAddress
|
|
308
|
+
? Hex.slice(publicKey, -20)
|
|
309
|
+
: Address.fromPublicKey(PublicKey.fromHex(publicKey));
|
|
310
|
+
return address;
|
|
311
|
+
}
|
|
312
|
+
return publicKey;
|
|
313
|
+
})();
|
|
314
|
+
return {
|
|
315
|
+
...key,
|
|
316
|
+
chainId,
|
|
317
|
+
expiry,
|
|
318
|
+
hash: hash({
|
|
319
|
+
publicKey,
|
|
320
|
+
type,
|
|
321
|
+
}),
|
|
322
|
+
id: (id ?? publicKey).toLowerCase(),
|
|
323
|
+
prehash,
|
|
324
|
+
publicKey: publicKey.toLowerCase(),
|
|
325
|
+
role,
|
|
326
|
+
type,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Instantiates a P256 key from its parameters.
|
|
331
|
+
*
|
|
332
|
+
* @example
|
|
333
|
+
* ```ts
|
|
334
|
+
* import { P256 } from 'ox'
|
|
335
|
+
* import * as Key from './key.js'
|
|
336
|
+
*
|
|
337
|
+
* // Admin Key
|
|
338
|
+
* const key = Key.fromP256({
|
|
339
|
+
* privateKey: P256.randomPrivateKey(),
|
|
340
|
+
* })
|
|
341
|
+
*
|
|
342
|
+
* // Session Key
|
|
343
|
+
* const key = Key.fromP256({
|
|
344
|
+
* expiry: 1714857600,
|
|
345
|
+
* privateKey: P256.randomPrivateKey(),
|
|
346
|
+
* role: 'session',
|
|
347
|
+
* })
|
|
348
|
+
* ```
|
|
349
|
+
*
|
|
350
|
+
* @param parameters - Key parameters.
|
|
351
|
+
* @returns P256 key.
|
|
352
|
+
*/
|
|
353
|
+
export function fromP256(parameters) {
|
|
354
|
+
const { chainId, expiry, feeToken, permissions, privateKey, role } = parameters;
|
|
355
|
+
const publicKey = PublicKey.toHex(P256.getPublicKey({ privateKey }), {
|
|
356
|
+
includePrefix: false,
|
|
357
|
+
});
|
|
358
|
+
return from({
|
|
359
|
+
chainId,
|
|
360
|
+
expiry,
|
|
361
|
+
feeToken,
|
|
362
|
+
permissions,
|
|
363
|
+
privateKey() {
|
|
364
|
+
return privateKey;
|
|
365
|
+
},
|
|
366
|
+
publicKey,
|
|
367
|
+
role,
|
|
368
|
+
type: 'p256',
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Converts a Relay-formatted key to a key.
|
|
373
|
+
*
|
|
374
|
+
* @example
|
|
375
|
+
* TODO
|
|
376
|
+
*
|
|
377
|
+
* @param relayKey - Relay key.
|
|
378
|
+
* @returns Key.
|
|
379
|
+
*/
|
|
380
|
+
export function fromRelay(relayKey, options) {
|
|
381
|
+
const { chainId } = options;
|
|
382
|
+
const { publicKey } = relayKey;
|
|
383
|
+
const isAddress = Hex.size(publicKey) === 20 ||
|
|
384
|
+
Hex.toBigInt(Hex.slice(publicKey, 0, 12)) === 0n;
|
|
385
|
+
const permissions = {};
|
|
386
|
+
for (const permission of relayKey.permissions) {
|
|
387
|
+
if (permission.type === 'call') {
|
|
388
|
+
permissions.calls ??= [];
|
|
389
|
+
permissions.calls.push({
|
|
390
|
+
signature: permission.selector,
|
|
391
|
+
to: permission.to === Call.anyTarget ? undefined : permission.to,
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
if (permission.type === 'spend') {
|
|
395
|
+
permissions.spend ??= [];
|
|
396
|
+
permissions.spend.push({
|
|
397
|
+
limit: permission.limit,
|
|
398
|
+
period: permission.period,
|
|
399
|
+
token: permission.token,
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
return from({
|
|
404
|
+
chainId,
|
|
405
|
+
expiry: relayKey.expiry,
|
|
406
|
+
permissions: permissions,
|
|
407
|
+
publicKey: relayKey.publicKey,
|
|
408
|
+
role: fromRelayKeyRole[relayKey.role],
|
|
409
|
+
type: isAddress ? 'address' : fromRelayKeyType[relayKey.type],
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Instantiates a Secp256k1 key from its parameters.
|
|
414
|
+
*
|
|
415
|
+
* @example
|
|
416
|
+
* ```ts
|
|
417
|
+
* import { Secp256k1 } from 'ox'
|
|
418
|
+
* import * as Key from './key.js'
|
|
419
|
+
*
|
|
420
|
+
* // Admin Key
|
|
421
|
+
* const key = Key.fromSecp256k1({
|
|
422
|
+
* privateKey: Secp256k1.randomPrivateKey(),
|
|
423
|
+
* })
|
|
424
|
+
*
|
|
425
|
+
* // Session Key
|
|
426
|
+
* const key = Key.fromSecp256k1({
|
|
427
|
+
* expiry: 1714857600,
|
|
428
|
+
* privateKey: Secp256k1.randomPrivateKey(),
|
|
429
|
+
* role: 'session',
|
|
430
|
+
* })
|
|
431
|
+
* ```
|
|
432
|
+
*
|
|
433
|
+
* @param parameters - Key parameters.
|
|
434
|
+
* @returns Secp256k1 key.
|
|
435
|
+
*/
|
|
436
|
+
export function fromSecp256k1(parameters) {
|
|
437
|
+
const { privateKey, role } = parameters;
|
|
438
|
+
const publicKey = (() => {
|
|
439
|
+
if (parameters.publicKey)
|
|
440
|
+
return parameters.publicKey;
|
|
441
|
+
if (privateKey)
|
|
442
|
+
return Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey }));
|
|
443
|
+
return parameters.address.toLowerCase();
|
|
444
|
+
})();
|
|
445
|
+
return from({
|
|
446
|
+
expiry: parameters.expiry ?? 0,
|
|
447
|
+
feeToken: parameters.feeToken,
|
|
448
|
+
permissions: parameters.permissions,
|
|
449
|
+
privateKey: privateKey ? () => privateKey : undefined,
|
|
450
|
+
publicKey,
|
|
451
|
+
role,
|
|
452
|
+
type: 'secp256k1',
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Instantiates a WebAuthnP256 key from its parameters.
|
|
457
|
+
*
|
|
458
|
+
* @example
|
|
459
|
+
* ```ts
|
|
460
|
+
* import { WebAuthnP256 } from 'ox'
|
|
461
|
+
* import * as Key from './key.js'
|
|
462
|
+
*
|
|
463
|
+
* const credential = await WebAuthnP256.createCredential({ name: 'My Key' })
|
|
464
|
+
*
|
|
465
|
+
* // Admin Key
|
|
466
|
+
* const key = Key.fromWebAuthnP256({
|
|
467
|
+
* credential,
|
|
468
|
+
* })
|
|
469
|
+
*
|
|
470
|
+
* // Session Key
|
|
471
|
+
* const key = Key.fromWebAuthnP256({
|
|
472
|
+
* expiry: 1714857600,
|
|
473
|
+
* credential,
|
|
474
|
+
* role: 'session',
|
|
475
|
+
* })
|
|
476
|
+
* ```
|
|
477
|
+
*
|
|
478
|
+
* @param parameters - Key parameters.
|
|
479
|
+
* @returns WebAuthnP256 key.
|
|
480
|
+
*/
|
|
481
|
+
export function fromWebAuthnP256(parameters) {
|
|
482
|
+
const { credential, id, rpId } = parameters;
|
|
483
|
+
const publicKey = PublicKey.toHex(credential.publicKey, {
|
|
484
|
+
includePrefix: false,
|
|
485
|
+
});
|
|
486
|
+
return from({
|
|
487
|
+
chainId: parameters.chainId,
|
|
488
|
+
expiry: parameters.expiry ?? 0,
|
|
489
|
+
feeToken: parameters.feeToken,
|
|
490
|
+
id,
|
|
491
|
+
permissions: parameters.permissions,
|
|
492
|
+
privateKey: {
|
|
493
|
+
credential,
|
|
494
|
+
rpId,
|
|
495
|
+
},
|
|
496
|
+
publicKey,
|
|
497
|
+
role: parameters.role,
|
|
498
|
+
type: 'webauthn-p256',
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Instantiates a WebAuthn-wrapped P256 key from its parameters.
|
|
503
|
+
*
|
|
504
|
+
* @example
|
|
505
|
+
* ```ts
|
|
506
|
+
* import { P256 } from 'ox'
|
|
507
|
+
* import * as Key from './key.js'
|
|
508
|
+
*
|
|
509
|
+
* const privateKey = P256.randomPrivateKey()
|
|
510
|
+
*
|
|
511
|
+
* // Admin Key
|
|
512
|
+
* const key = Key.fromHeadlessWebAuthnP256({
|
|
513
|
+
* privateKey,
|
|
514
|
+
* })
|
|
515
|
+
*
|
|
516
|
+
* // Session Key
|
|
517
|
+
* const key = Key.fromHeadlessWebAuthnP256({
|
|
518
|
+
* expiry: 1714857600,
|
|
519
|
+
* privateKey,
|
|
520
|
+
* role: 'session',
|
|
521
|
+
* })
|
|
522
|
+
* ```
|
|
523
|
+
*
|
|
524
|
+
* @param parameters - Key parameters.
|
|
525
|
+
* @returns WebAuthn-wrapped P256 key.
|
|
526
|
+
*/
|
|
527
|
+
export function fromHeadlessWebAuthnP256(parameters) {
|
|
528
|
+
const { privateKey } = parameters;
|
|
529
|
+
const publicKey = PublicKey.toHex(P256.getPublicKey({ privateKey }), {
|
|
530
|
+
includePrefix: false,
|
|
531
|
+
});
|
|
532
|
+
return from({
|
|
533
|
+
chainId: parameters.chainId,
|
|
534
|
+
expiry: parameters.expiry ?? 0,
|
|
535
|
+
feeToken: parameters.feeToken,
|
|
536
|
+
permissions: parameters.permissions,
|
|
537
|
+
privateKey: {
|
|
538
|
+
privateKey() {
|
|
539
|
+
return privateKey;
|
|
540
|
+
},
|
|
541
|
+
},
|
|
542
|
+
publicKey,
|
|
543
|
+
role: parameters.role,
|
|
544
|
+
type: 'webauthn-p256',
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* Instantiates a WebCryptoP256 key from its parameters.
|
|
549
|
+
*
|
|
550
|
+
* @example
|
|
551
|
+
* ```ts
|
|
552
|
+
* import { WebCryptoP256 } from 'ox'
|
|
553
|
+
* import * as Key from './key.js'
|
|
554
|
+
*
|
|
555
|
+
* const keyPair = await WebCryptoP256.createKeyPair()
|
|
556
|
+
*
|
|
557
|
+
* // Admin Key
|
|
558
|
+
* const key = Key.fromWebCryptoP256({
|
|
559
|
+
* keyPair,
|
|
560
|
+
* })
|
|
561
|
+
*
|
|
562
|
+
* // Session Key
|
|
563
|
+
* const key = Key.fromWebCryptoP256({
|
|
564
|
+
* expiry: 1714857600,
|
|
565
|
+
* keyPair,
|
|
566
|
+
* role: 'session',
|
|
567
|
+
* })
|
|
568
|
+
* ```
|
|
569
|
+
*
|
|
570
|
+
* @param parameters - Key parameters.
|
|
571
|
+
* @returns WebCryptoP256 key.
|
|
572
|
+
*/
|
|
573
|
+
export function fromWebCryptoP256(parameters) {
|
|
574
|
+
const { chainId, expiry, feeToken, keyPair, permissions, role } = parameters;
|
|
575
|
+
const { privateKey } = keyPair;
|
|
576
|
+
const publicKey = PublicKey.toHex(keyPair.publicKey, {
|
|
577
|
+
includePrefix: false,
|
|
578
|
+
});
|
|
579
|
+
return from({
|
|
580
|
+
chainId,
|
|
581
|
+
expiry,
|
|
582
|
+
feeToken,
|
|
583
|
+
permissions,
|
|
584
|
+
prehash: true,
|
|
585
|
+
privateKey,
|
|
586
|
+
publicKey,
|
|
587
|
+
role,
|
|
588
|
+
type: 'p256',
|
|
589
|
+
});
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* Hashes a key.
|
|
593
|
+
*
|
|
594
|
+
* @example
|
|
595
|
+
* ```ts
|
|
596
|
+
* import * as Key from './key.js'
|
|
597
|
+
*
|
|
598
|
+
* const key = Key.createP256()
|
|
599
|
+
*
|
|
600
|
+
* const hash = Key.hash(key)
|
|
601
|
+
* ```
|
|
602
|
+
*
|
|
603
|
+
* @param key - Key.
|
|
604
|
+
* @returns Hashed key.
|
|
605
|
+
*/
|
|
606
|
+
export function hash(key) {
|
|
607
|
+
const { type } = key;
|
|
608
|
+
const publicKey = serializePublicKey(key.publicKey);
|
|
609
|
+
return Hash.keccak256(AbiParameters.encode([{ type: 'uint8' }, { type: 'bytes32' }], [toSerializedKeyType[type], Hash.keccak256(publicKey)]));
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* Serializes a public key.
|
|
613
|
+
*
|
|
614
|
+
* @param publicKey - Public key.
|
|
615
|
+
* @returns Serialized public key.
|
|
616
|
+
*/
|
|
617
|
+
export function serializePublicKey(publicKey) {
|
|
618
|
+
return Hex.size(publicKey) < 32 ? Hex.padLeft(publicKey, 32) : publicKey;
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* Serializes a key to a contract-compatible format.
|
|
622
|
+
*
|
|
623
|
+
* @example
|
|
624
|
+
* ```ts
|
|
625
|
+
* import * as Key from './key.js'
|
|
626
|
+
*
|
|
627
|
+
* const key = Key.createP256()
|
|
628
|
+
*
|
|
629
|
+
* const serialized = Key.serialize(key)
|
|
630
|
+
* ```
|
|
631
|
+
*
|
|
632
|
+
* @param key - Key.
|
|
633
|
+
* @returns Serialized key.
|
|
634
|
+
*/
|
|
635
|
+
export function serialize(key) {
|
|
636
|
+
const { expiry = 0, publicKey, role, type } = key;
|
|
637
|
+
return {
|
|
638
|
+
expiry,
|
|
639
|
+
isSuperAdmin: role === 'admin',
|
|
640
|
+
keyType: toSerializedKeyType[type],
|
|
641
|
+
publicKey: serializePublicKey(publicKey),
|
|
642
|
+
};
|
|
643
|
+
}
|
|
644
|
+
export async function sign(key, parameters) {
|
|
645
|
+
const { address, storage, webAuthn, wrap = true } = parameters;
|
|
646
|
+
const { privateKey, publicKey, type: keyType } = key;
|
|
647
|
+
if (!privateKey)
|
|
648
|
+
throw new Error('Key does not have a private key to sign with.\n\nKey:\n' +
|
|
649
|
+
Json.stringify(key, null, 2));
|
|
650
|
+
const payload = (() => {
|
|
651
|
+
if (!address)
|
|
652
|
+
return parameters.payload;
|
|
653
|
+
return TypedData.getSignPayload({
|
|
654
|
+
domain: { verifyingContract: address },
|
|
655
|
+
message: {
|
|
656
|
+
digest: parameters.payload,
|
|
657
|
+
},
|
|
658
|
+
primaryType: 'ERC1271Sign',
|
|
659
|
+
types: {
|
|
660
|
+
ERC1271Sign: [{ name: 'digest', type: 'bytes32' }],
|
|
661
|
+
},
|
|
662
|
+
});
|
|
663
|
+
})();
|
|
664
|
+
const [signature, prehash] = await (async () => {
|
|
665
|
+
if (keyType === 'p256') {
|
|
666
|
+
const { privateKey } = key;
|
|
667
|
+
if (typeof privateKey === 'function')
|
|
668
|
+
return [
|
|
669
|
+
Signature.toHex(P256.sign({ payload, privateKey: privateKey() })),
|
|
670
|
+
false,
|
|
671
|
+
];
|
|
672
|
+
if (privateKey instanceof CryptoKey) {
|
|
673
|
+
const signature = Signature.toHex(await WebCryptoP256.sign({ payload, privateKey }));
|
|
674
|
+
return [signature, true];
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
if (keyType === 'secp256k1') {
|
|
678
|
+
return [
|
|
679
|
+
Signature.toHex(Secp256k1.sign({ payload, privateKey: privateKey() })),
|
|
680
|
+
false,
|
|
681
|
+
];
|
|
682
|
+
}
|
|
683
|
+
if (keyType === 'webauthn-p256') {
|
|
684
|
+
if (privateKey.privateKey) {
|
|
685
|
+
const { payload: wrapped, metadata } = WebAuthnP256.getSignPayload({
|
|
686
|
+
challenge: payload,
|
|
687
|
+
origin: 'https://ithaca.xyz',
|
|
688
|
+
rpId: 'ithaca.xyz',
|
|
689
|
+
});
|
|
690
|
+
const { r, s } = P256.sign({
|
|
691
|
+
hash: true,
|
|
692
|
+
payload: wrapped,
|
|
693
|
+
privateKey: privateKey.privateKey(),
|
|
694
|
+
});
|
|
695
|
+
const signature = serializeWebAuthnSignature({
|
|
696
|
+
metadata,
|
|
697
|
+
signature: { r, s },
|
|
698
|
+
});
|
|
699
|
+
return [signature, false];
|
|
700
|
+
}
|
|
701
|
+
const { credential, rpId } = privateKey;
|
|
702
|
+
const cacheKey = `porto.webauthnVerified.${key.hash}`;
|
|
703
|
+
const now = Date.now();
|
|
704
|
+
const verificationTimeout = 10 * 60 * 1_000; // 10 minutes in milliseconds
|
|
705
|
+
let requireVerification = true;
|
|
706
|
+
if (storage) {
|
|
707
|
+
const lastVerified = await storage.getItem(cacheKey);
|
|
708
|
+
requireVerification =
|
|
709
|
+
!lastVerified || now - lastVerified > verificationTimeout;
|
|
710
|
+
}
|
|
711
|
+
const { signature: { r, s }, raw, metadata, } = await WebAuthnP256.sign({
|
|
712
|
+
challenge: payload,
|
|
713
|
+
credentialId: credential.id,
|
|
714
|
+
getFn: webAuthn?.getFn,
|
|
715
|
+
rpId,
|
|
716
|
+
userVerification: requireVerification ? 'required' : 'preferred',
|
|
717
|
+
});
|
|
718
|
+
const response = raw.response;
|
|
719
|
+
if (!response?.userHandle)
|
|
720
|
+
throw new Error('No user handle in response', {
|
|
721
|
+
cause: { response },
|
|
722
|
+
});
|
|
723
|
+
const id = Bytes.toHex(new Uint8Array(response.userHandle));
|
|
724
|
+
if (key.id && Address.validate(key.id) && !Address.isEqual(key.id, id))
|
|
725
|
+
throw new Error(`supplied webauthn key "${key.id}" does not match signature webauthn key "${id}"`, { cause: { id, key } });
|
|
726
|
+
if (requireVerification && storage)
|
|
727
|
+
await storage.setItem(cacheKey, now);
|
|
728
|
+
const signature = serializeWebAuthnSignature({
|
|
729
|
+
metadata,
|
|
730
|
+
signature: { r, s },
|
|
731
|
+
});
|
|
732
|
+
return [signature, false];
|
|
733
|
+
}
|
|
734
|
+
throw new Error(`Key type "${keyType}" is not supported.\n\nKey:\n` +
|
|
735
|
+
Json.stringify(key, null, 2));
|
|
736
|
+
})();
|
|
737
|
+
if (wrap)
|
|
738
|
+
return wrapSignature(signature, {
|
|
739
|
+
keyType,
|
|
740
|
+
prehash,
|
|
741
|
+
publicKey,
|
|
742
|
+
});
|
|
743
|
+
return signature;
|
|
744
|
+
}
|
|
745
|
+
/**
|
|
746
|
+
* Converts a key to a Relay-compatible format.
|
|
747
|
+
*
|
|
748
|
+
* @example
|
|
749
|
+
* TODO
|
|
750
|
+
*
|
|
751
|
+
* @param key - Key.
|
|
752
|
+
* @returns Relay key.
|
|
753
|
+
*/
|
|
754
|
+
export function toRelay(key, options = {}) {
|
|
755
|
+
const { expiry = 0, prehash = false, publicKey, role = 'admin', type } = key;
|
|
756
|
+
const { feeTokens, orchestrator } = options;
|
|
757
|
+
// biome-ignore lint/complexity/useFlatMap: i know
|
|
758
|
+
const permissions = Object.entries(resolvePermissions(key, {
|
|
759
|
+
feeTokens,
|
|
760
|
+
}))
|
|
761
|
+
// biome-ignore lint/suspicious/useIterableCallbackReturn: _
|
|
762
|
+
.map(([key, v]) => {
|
|
763
|
+
if (key === 'calls') {
|
|
764
|
+
const calls = v;
|
|
765
|
+
return calls.map(({ signature, to }) => {
|
|
766
|
+
const selector = (() => {
|
|
767
|
+
if (!signature)
|
|
768
|
+
return Call.anySelector;
|
|
769
|
+
if (Hex.validate(signature))
|
|
770
|
+
return signature;
|
|
771
|
+
return AbiFunction.getSelector(signature);
|
|
772
|
+
})();
|
|
773
|
+
return {
|
|
774
|
+
selector,
|
|
775
|
+
to: to ?? Call.anyTarget,
|
|
776
|
+
type: 'call',
|
|
777
|
+
};
|
|
778
|
+
});
|
|
779
|
+
}
|
|
780
|
+
if (key === 'feeToken')
|
|
781
|
+
return;
|
|
782
|
+
if (key === 'spend') {
|
|
783
|
+
const value = v;
|
|
784
|
+
return value.map(({ limit, period, token }) => {
|
|
785
|
+
return {
|
|
786
|
+
limit,
|
|
787
|
+
period,
|
|
788
|
+
token,
|
|
789
|
+
type: 'spend',
|
|
790
|
+
};
|
|
791
|
+
});
|
|
792
|
+
}
|
|
793
|
+
throw new Error(`Invalid permission type "${key}".`);
|
|
794
|
+
})
|
|
795
|
+
.flat()
|
|
796
|
+
.filter(Boolean);
|
|
797
|
+
if (key.role === 'session' && orchestrator)
|
|
798
|
+
permissions.push({
|
|
799
|
+
selector: Call.anySelector,
|
|
800
|
+
to: orchestrator,
|
|
801
|
+
type: 'call',
|
|
802
|
+
});
|
|
803
|
+
return {
|
|
804
|
+
expiry,
|
|
805
|
+
permissions: permissions ?? [],
|
|
806
|
+
prehash,
|
|
807
|
+
publicKey: serializePublicKey(publicKey),
|
|
808
|
+
role: toRelayKeyRole[role],
|
|
809
|
+
type: toRelayKeyType[type],
|
|
810
|
+
};
|
|
811
|
+
}
|
|
812
|
+
/**
|
|
813
|
+
* Resolves the permissions for the permissions request, and if needed, adds
|
|
814
|
+
* the fee limit to the spend permissions.
|
|
815
|
+
*
|
|
816
|
+
* @param request - Permissions request.
|
|
817
|
+
* @param options - Options.
|
|
818
|
+
* @returns Resolved permissions.
|
|
819
|
+
*/
|
|
820
|
+
export function resolvePermissions(key, options) {
|
|
821
|
+
const { permissions } = key;
|
|
822
|
+
const calls = permissions?.calls ? [...permissions.calls] : [];
|
|
823
|
+
const spend = permissions?.spend ? [...permissions.spend] : [];
|
|
824
|
+
const feeTokens = options.feeTokens?.filter((token) => token.feeToken);
|
|
825
|
+
if (feeTokens && feeTokens.length > 0) {
|
|
826
|
+
const feeToken = getFeeToken(key, {
|
|
827
|
+
feeTokens,
|
|
828
|
+
});
|
|
829
|
+
if (feeToken) {
|
|
830
|
+
let index = -1;
|
|
831
|
+
let minPeriod = toSerializedSpendPeriod.year;
|
|
832
|
+
for (let i = 0; i < spend.length; i++) {
|
|
833
|
+
const s = spend[i];
|
|
834
|
+
if (s.token && Address.isEqual(feeToken.address, s.token)) {
|
|
835
|
+
index = i;
|
|
836
|
+
break;
|
|
837
|
+
}
|
|
838
|
+
if (!s.token && feeToken.address === zeroAddress) {
|
|
839
|
+
index = i;
|
|
840
|
+
break;
|
|
841
|
+
}
|
|
842
|
+
const period = toSerializedSpendPeriod[s.period];
|
|
843
|
+
if (period < minPeriod)
|
|
844
|
+
minPeriod = period;
|
|
845
|
+
}
|
|
846
|
+
// If there is a token assigned to a spend permission and the fee token
|
|
847
|
+
// is the same, update the limit to account for the fee.
|
|
848
|
+
if (index !== -1) {
|
|
849
|
+
spend[index] = {
|
|
850
|
+
...spend[index],
|
|
851
|
+
limit: spend[index].limit + feeToken.value,
|
|
852
|
+
};
|
|
853
|
+
// Assign this as the first spend permission, as it will be used
|
|
854
|
+
// as the fee token for call bundles that use this key.
|
|
855
|
+
spend.unshift(spend.splice(index, 1)[0]);
|
|
856
|
+
}
|
|
857
|
+
// Update the spend permissions to account for the fee token.
|
|
858
|
+
// The fee token permission must be assigned as the first spend
|
|
859
|
+
// permission as it will be used as the fee token for call bundles
|
|
860
|
+
// that use this key.
|
|
861
|
+
else if (typeof minPeriod === 'number')
|
|
862
|
+
spend.unshift({
|
|
863
|
+
limit: feeToken.value,
|
|
864
|
+
period: fromSerializedSpendPeriod[minPeriod],
|
|
865
|
+
token: feeToken.address,
|
|
866
|
+
});
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
return { ...permissions, calls, spend };
|
|
870
|
+
}
|
|
871
|
+
/**
|
|
872
|
+
* Gets the fee limit (in units of the fee token) to be used for the
|
|
873
|
+
* authorized permissions.
|
|
874
|
+
*
|
|
875
|
+
* @param request - The permissions request to get the fee limit for.
|
|
876
|
+
* @param options - Options.
|
|
877
|
+
* @returns Fee limit (in units of the fee token).
|
|
878
|
+
*/
|
|
879
|
+
export function getFeeToken(key, options) {
|
|
880
|
+
const { feeTokens } = options;
|
|
881
|
+
if (!key.feeToken)
|
|
882
|
+
return undefined;
|
|
883
|
+
const feeToken = feeTokens.find((token) => {
|
|
884
|
+
if (key.feeToken.symbol === token.symbol)
|
|
885
|
+
return true;
|
|
886
|
+
if (!key.feeToken.symbol)
|
|
887
|
+
return token.address === zeroAddress;
|
|
888
|
+
if (key.feeToken.symbol === 'native')
|
|
889
|
+
return token.address === zeroAddress;
|
|
890
|
+
return false;
|
|
891
|
+
});
|
|
892
|
+
if (!feeToken)
|
|
893
|
+
return undefined;
|
|
894
|
+
const value = Value.from(key.feeToken.limit, feeToken.decimals);
|
|
895
|
+
return {
|
|
896
|
+
...feeToken,
|
|
897
|
+
value,
|
|
898
|
+
};
|
|
899
|
+
}
|
|
900
|
+
///////////////////////////////////////////////////////////////////////////
|
|
901
|
+
// Internal
|
|
902
|
+
///////////////////////////////////////////////////////////////////////////
|
|
903
|
+
export function serializeWebAuthnSignature(options) {
|
|
904
|
+
const { metadata, signature } = options;
|
|
905
|
+
return AbiParameters.encode(AbiParameters.from([
|
|
906
|
+
'struct WebAuthnAuth { bytes authenticatorData; string clientDataJSON; uint256 challengeIndex; uint256 typeIndex; bytes32 r; bytes32 s; }',
|
|
907
|
+
'WebAuthnAuth auth',
|
|
908
|
+
]), [
|
|
909
|
+
{
|
|
910
|
+
authenticatorData: metadata.authenticatorData,
|
|
911
|
+
challengeIndex: BigInt(metadata.challengeIndex),
|
|
912
|
+
clientDataJSON: metadata.clientDataJSON,
|
|
913
|
+
r: Hex.fromNumber(signature.r, { size: 32 }),
|
|
914
|
+
s: Hex.fromNumber(signature.s, { size: 32 }),
|
|
915
|
+
typeIndex: BigInt(metadata.typeIndex),
|
|
916
|
+
},
|
|
917
|
+
]);
|
|
918
|
+
}
|
|
919
|
+
export function wrapSignature(signature, options) {
|
|
920
|
+
const { keyType: type, prehash = false, publicKey } = options;
|
|
921
|
+
const keyHash = hash({ publicKey, type });
|
|
922
|
+
return AbiParameters.encodePacked(['bytes', 'bytes32', 'bool'], [signature, keyHash, prehash]);
|
|
923
|
+
}
|
|
924
|
+
//# sourceMappingURL=Key.js.map
|