ox 0.0.1 → 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/Abi/package.json +6 -0
- package/Abi.ts +163 -0
- package/AbiConstructor/package.json +6 -0
- package/AbiConstructor.ts +413 -0
- package/AbiError/package.json +6 -0
- package/AbiError.ts +719 -0
- package/AbiEvent/package.json +6 -0
- package/AbiEvent.ts +1284 -0
- package/AbiFunction/package.json +6 -0
- package/AbiFunction.ts +813 -0
- package/AbiItem/package.json +6 -0
- package/AbiItem.ts +779 -0
- package/AbiParameters/package.json +6 -0
- package/AbiParameters.ts +712 -0
- package/AccessList/package.json +6 -0
- package/AccessList.ts +124 -0
- package/AccountProof/package.json +6 -0
- package/AccountProof.ts +35 -0
- package/Address/package.json +6 -0
- package/Address.ts +359 -0
- package/AesGcm/package.json +6 -0
- package/AesGcm.ts +220 -0
- package/Authorization/package.json +6 -0
- package/Authorization.ts +639 -0
- package/Base58/package.json +6 -0
- package/Base58.ts +180 -0
- package/Base64/package.json +6 -0
- package/Base64.ts +333 -0
- package/Blobs/package.json +6 -0
- package/Blobs.ts +982 -0
- package/Block/package.json +6 -0
- package/Block.ts +317 -0
- package/Bloom/package.json +6 -0
- package/Bloom.ts +80 -0
- package/Bls/package.json +6 -0
- package/Bls.ts +496 -0
- package/BlsPoint/package.json +6 -0
- package/BlsPoint.ts +232 -0
- package/Bytes/package.json +6 -0
- package/Bytes.ts +963 -0
- package/CHANGELOG.md +7 -0
- package/Caches/package.json +6 -0
- package/Caches.ts +21 -0
- package/ContractAddress/package.json +6 -0
- package/ContractAddress.ts +181 -0
- package/Ens/package.json +6 -0
- package/Ens.ts +116 -0
- package/Errors/package.json +6 -0
- package/Errors.ts +95 -0
- package/Fee/package.json +6 -0
- package/Fee.ts +57 -0
- package/Filter/package.json +6 -0
- package/Filter.ts +144 -0
- package/Hash/package.json +6 -0
- package/Hash.ts +210 -0
- package/HdKey/package.json +6 -0
- package/HdKey.ts +175 -0
- package/Hex/package.json +6 -0
- package/Hex.ts +1040 -0
- package/Json/package.json +6 -0
- package/Json.ts +84 -0
- package/Kzg/package.json +6 -0
- package/Kzg.ts +51 -0
- package/LICENSE +21 -0
- package/Log/package.json +6 -0
- package/Log.ts +248 -0
- package/Mnemonic/package.json +6 -0
- package/Mnemonic.ts +249 -0
- package/P256/package.json +6 -0
- package/P256.ts +230 -0
- package/PersonalMessage/package.json +6 -0
- package/PersonalMessage.ts +70 -0
- package/Provider/package.json +6 -0
- package/Provider.ts +354 -0
- package/PublicKey/package.json +6 -0
- package/PublicKey.ts +545 -0
- package/README.md +75 -26
- package/Rlp/package.json +6 -0
- package/Rlp.ts +390 -0
- package/RpcRequest/package.json +6 -0
- package/RpcRequest.ts +192 -0
- package/RpcResponse/package.json +6 -0
- package/RpcResponse.ts +389 -0
- package/RpcSchema/package.json +6 -0
- package/RpcSchema.ts +273 -0
- package/RpcTransport/package.json +6 -0
- package/RpcTransport.ts +198 -0
- package/Secp256k1/package.json +6 -0
- package/Secp256k1.ts +304 -0
- package/Signature/package.json +6 -0
- package/Signature.ts +909 -0
- package/Siwe/package.json +6 -0
- package/Siwe.ts +516 -0
- package/Solidity/package.json +6 -0
- package/Solidity.ts +109 -0
- package/Transaction/package.json +6 -0
- package/Transaction.ts +429 -0
- package/TransactionEnvelope/package.json +6 -0
- package/TransactionEnvelope.ts +205 -0
- package/TransactionEnvelopeEip1559/package.json +6 -0
- package/TransactionEnvelopeEip1559.ts +656 -0
- package/TransactionEnvelopeEip2930/package.json +6 -0
- package/TransactionEnvelopeEip2930.ts +624 -0
- package/TransactionEnvelopeEip4844/package.json +6 -0
- package/TransactionEnvelopeEip4844.ts +764 -0
- package/TransactionEnvelopeEip7702/package.json +6 -0
- package/TransactionEnvelopeEip7702.ts +639 -0
- package/TransactionEnvelopeLegacy/package.json +6 -0
- package/TransactionEnvelopeLegacy.ts +674 -0
- package/TransactionReceipt/package.json +6 -0
- package/TransactionReceipt.ts +341 -0
- package/TransactionRequest/package.json +6 -0
- package/TransactionRequest.ts +151 -0
- package/TypedData/package.json +6 -0
- package/TypedData.ts +931 -0
- package/ValidatorData/package.json +6 -0
- package/ValidatorData.ts +87 -0
- package/Value/package.json +6 -0
- package/Value.ts +242 -0
- package/WebAuthnP256/package.json +6 -0
- package/WebAuthnP256.ts +803 -0
- package/WebCryptoP256/package.json +6 -0
- package/WebCryptoP256.ts +190 -0
- package/Withdrawal/package.json +6 -0
- package/Withdrawal.ts +95 -0
- package/_cjs/Abi.js +17 -0
- package/_cjs/Abi.js.map +1 -0
- package/_cjs/AbiConstructor.js +42 -0
- package/_cjs/AbiConstructor.js.map +1 -0
- package/_cjs/AbiError.js +98 -0
- package/_cjs/AbiError.js.map +1 -0
- package/_cjs/AbiEvent.js +338 -0
- package/_cjs/AbiEvent.js.map +1 -0
- package/_cjs/AbiFunction.js +85 -0
- package/_cjs/AbiFunction.js.map +1 -0
- package/_cjs/AbiItem.js +180 -0
- package/_cjs/AbiItem.js.map +1 -0
- package/_cjs/AbiParameters.js +229 -0
- package/_cjs/AbiParameters.js.map +1 -0
- package/_cjs/AccessList.js +51 -0
- package/_cjs/AccessList.js.map +1 -0
- package/_cjs/AccountProof.js +3 -0
- package/_cjs/AccountProof.js.map +1 -0
- package/_cjs/Address.js +121 -0
- package/_cjs/Address.js.map +1 -0
- package/_cjs/AesGcm.js +55 -0
- package/_cjs/AesGcm.js.map +1 -0
- package/_cjs/Authorization.js +99 -0
- package/_cjs/Authorization.js.map +1 -0
- package/_cjs/Base58.js +52 -0
- package/_cjs/Base58.js.map +1 -0
- package/_cjs/Base64.js +76 -0
- package/_cjs/Base64.js.map +1 -0
- package/_cjs/Blobs.js +255 -0
- package/_cjs/Blobs.js.map +1 -0
- package/_cjs/Block.js +87 -0
- package/_cjs/Block.js.map +1 -0
- package/_cjs/Bloom.js +23 -0
- package/_cjs/Bloom.js.map +1 -0
- package/_cjs/Bls.js +79 -0
- package/_cjs/Bls.js.map +1 -0
- package/_cjs/BlsPoint.js +32 -0
- package/_cjs/BlsPoint.js.map +1 -0
- package/_cjs/Bytes.js +279 -0
- package/_cjs/Bytes.js.map +1 -0
- package/_cjs/Caches.js +14 -0
- package/_cjs/Caches.js.map +1 -0
- package/_cjs/ContractAddress.js +39 -0
- package/_cjs/ContractAddress.js.map +1 -0
- package/_cjs/Ens.js +37 -0
- package/_cjs/Ens.js.map +1 -0
- package/_cjs/Errors.js +99 -0
- package/_cjs/Errors.js.map +1 -0
- package/_cjs/Fee.js +3 -0
- package/_cjs/Fee.js.map +1 -0
- package/_cjs/Filter.js +43 -0
- package/_cjs/Filter.js.map +1 -0
- package/_cjs/Hash.js +40 -0
- package/_cjs/Hash.js.map +1 -0
- package/_cjs/HdKey.js +30 -0
- package/_cjs/HdKey.js.map +1 -0
- package/_cjs/Hex.js +324 -0
- package/_cjs/Hex.js.map +1 -0
- package/_cjs/Json.js +25 -0
- package/_cjs/Json.js.map +1 -0
- package/_cjs/Kzg.js +14 -0
- package/_cjs/Kzg.js.map +1 -0
- package/_cjs/Log.js +35 -0
- package/_cjs/Log.js.map +1 -0
- package/_cjs/Mnemonic.js +56 -0
- package/_cjs/Mnemonic.js.map +1 -0
- package/_cjs/P256.js +52 -0
- package/_cjs/P256.js.map +1 -0
- package/_cjs/PersonalMessage.js +16 -0
- package/_cjs/PersonalMessage.js.map +1 -0
- package/_cjs/Provider.js +90 -0
- package/_cjs/Provider.js.map +1 -0
- package/_cjs/PublicKey.js +192 -0
- package/_cjs/PublicKey.js.map +1 -0
- package/_cjs/Rlp.js +179 -0
- package/_cjs/Rlp.js.map +1 -0
- package/_cjs/RpcRequest.js +27 -0
- package/_cjs/RpcRequest.js.map +1 -0
- package/_cjs/RpcResponse.js +368 -0
- package/_cjs/RpcResponse.js.map +1 -0
- package/_cjs/RpcSchema.js +7 -0
- package/_cjs/RpcSchema.js.map +1 -0
- package/_cjs/RpcTransport.js +95 -0
- package/_cjs/RpcTransport.js.map +1 -0
- package/_cjs/Secp256k1.js +57 -0
- package/_cjs/Secp256k1.js.map +1 -0
- package/_cjs/Signature.js +305 -0
- package/_cjs/Signature.js.map +1 -0
- package/_cjs/Siwe.js +231 -0
- package/_cjs/Siwe.js.map +1 -0
- package/_cjs/Solidity.js +104 -0
- package/_cjs/Solidity.js.map +1 -0
- package/_cjs/Transaction.js +106 -0
- package/_cjs/Transaction.js.map +1 -0
- package/_cjs/TransactionEnvelope.js +80 -0
- package/_cjs/TransactionEnvelope.js.map +1 -0
- package/_cjs/TransactionEnvelopeEip1559.js +182 -0
- package/_cjs/TransactionEnvelopeEip1559.js.map +1 -0
- package/_cjs/TransactionEnvelopeEip2930.js +166 -0
- package/_cjs/TransactionEnvelopeEip2930.js.map +1 -0
- package/_cjs/TransactionEnvelopeEip4844.js +224 -0
- package/_cjs/TransactionEnvelopeEip4844.js.map +1 -0
- package/_cjs/TransactionEnvelopeEip7702.js +156 -0
- package/_cjs/TransactionEnvelopeEip7702.js.map +1 -0
- package/_cjs/TransactionEnvelopeLegacy.js +221 -0
- package/_cjs/TransactionEnvelopeLegacy.js.map +1 -0
- package/_cjs/TransactionReceipt.js +76 -0
- package/_cjs/TransactionReceipt.js.map +1 -0
- package/_cjs/TransactionRequest.js +51 -0
- package/_cjs/TransactionRequest.js.map +1 -0
- package/_cjs/TypedData.js +318 -0
- package/_cjs/TypedData.js.map +1 -0
- package/_cjs/ValidatorData.js +16 -0
- package/_cjs/ValidatorData.js.map +1 -0
- package/_cjs/Value.js +96 -0
- package/_cjs/Value.js.map +1 -0
- package/_cjs/WebAuthnP256.js +245 -0
- package/_cjs/WebAuthnP256.js.map +1 -0
- package/_cjs/WebCryptoP256.js +46 -0
- package/_cjs/WebCryptoP256.js.map +1 -0
- package/_cjs/Withdrawal.js +24 -0
- package/_cjs/Withdrawal.js.map +1 -0
- package/_cjs/index.js +66 -0
- package/_cjs/index.js.map +1 -0
- package/_cjs/internal/abi.js +11 -0
- package/_cjs/internal/abi.js.map +1 -0
- package/_cjs/internal/abiConstructor.js +3 -0
- package/_cjs/internal/abiConstructor.js.map +1 -0
- package/_cjs/internal/abiError.js +3 -0
- package/_cjs/internal/abiError.js.map +1 -0
- package/_cjs/internal/abiEvent.js +3 -0
- package/_cjs/internal/abiEvent.js.map +1 -0
- package/_cjs/internal/abiFunction.js +3 -0
- package/_cjs/internal/abiFunction.js.map +1 -0
- package/_cjs/internal/abiItem.js +110 -0
- package/_cjs/internal/abiItem.js.map +1 -0
- package/_cjs/internal/abiParameters.js +376 -0
- package/_cjs/internal/abiParameters.js.map +1 -0
- package/_cjs/internal/base58.js +89 -0
- package/_cjs/internal/base58.js.map +1 -0
- package/_cjs/internal/bytes.js +88 -0
- package/_cjs/internal/bytes.js.map +1 -0
- package/_cjs/internal/cursor.js +210 -0
- package/_cjs/internal/cursor.js.map +1 -0
- package/_cjs/internal/ens.js +43 -0
- package/_cjs/internal/ens.js.map +1 -0
- package/_cjs/internal/errors.js +28 -0
- package/_cjs/internal/errors.js.map +1 -0
- package/_cjs/internal/hdKey.js +19 -0
- package/_cjs/internal/hdKey.js.map +1 -0
- package/_cjs/internal/hex.js +66 -0
- package/_cjs/internal/hex.js.map +1 -0
- package/_cjs/internal/lru.js +34 -0
- package/_cjs/internal/lru.js.map +1 -0
- package/_cjs/internal/mnemonic/wordlists.js +24 -0
- package/_cjs/internal/mnemonic/wordlists.js.map +1 -0
- package/_cjs/internal/promise.js +49 -0
- package/_cjs/internal/promise.js.map +1 -0
- package/_cjs/internal/register.js +3 -0
- package/_cjs/internal/register.js.map +1 -0
- package/_cjs/internal/rpcSchema.js +3 -0
- package/_cjs/internal/rpcSchema.js.map +1 -0
- package/_cjs/internal/rpcSchemas/eth.js +3 -0
- package/_cjs/internal/rpcSchemas/eth.js.map +1 -0
- package/_cjs/internal/rpcSchemas/wallet.js +3 -0
- package/_cjs/internal/rpcSchemas/wallet.js.map +1 -0
- package/_cjs/internal/rpcTransport.js +19 -0
- package/_cjs/internal/rpcTransport.js.map +1 -0
- package/_cjs/internal/types.js +3 -0
- package/_cjs/internal/types.js.map +1 -0
- package/_cjs/internal/uid.js +17 -0
- package/_cjs/internal/uid.js.map +1 -0
- package/_cjs/internal/webauthn.js +28 -0
- package/_cjs/internal/webauthn.js.map +1 -0
- package/_cjs/package.json +1 -0
- package/_cjs/trusted-setups/Paths.js +6 -0
- package/_cjs/trusted-setups/Paths.js.map +1 -0
- package/_cjs/trusted-setups/index.js +5 -0
- package/_cjs/trusted-setups/index.js.map +1 -0
- package/_cjs/trusted-setups/internal/paths.js +11 -0
- package/_cjs/trusted-setups/internal/paths.js.map +1 -0
- package/_cjs/version.js +5 -0
- package/_cjs/version.js.map +1 -0
- package/_cjs/window/index.js +3 -0
- package/_cjs/window/index.js.map +1 -0
- package/_esm/Abi.js +19 -0
- package/_esm/Abi.js.map +1 -0
- package/_esm/AbiConstructor.js +102 -0
- package/_esm/AbiConstructor.js.map +1 -0
- package/_esm/AbiError.js +364 -0
- package/_esm/AbiError.js.map +1 -0
- package/_esm/AbiEvent.js +1038 -0
- package/_esm/AbiEvent.js.map +1 -0
- package/_esm/AbiFunction.js +549 -0
- package/_esm/AbiFunction.js.map +1 -0
- package/_esm/AbiItem.js +574 -0
- package/_esm/AbiItem.js.map +1 -0
- package/_esm/AbiParameters.js +543 -0
- package/_esm/AbiParameters.js.map +1 -0
- package/_esm/AccessList.js +105 -0
- package/_esm/AccessList.js.map +1 -0
- package/_esm/AccountProof.js +2 -0
- package/_esm/AccountProof.js.map +1 -0
- package/_esm/Address.js +268 -0
- package/_esm/Address.js.map +1 -0
- package/_esm/AesGcm.js +124 -0
- package/_esm/AesGcm.js.map +1 -0
- package/_esm/Authorization.js +441 -0
- package/_esm/Authorization.js.map +1 -0
- package/_esm/Base58.js +142 -0
- package/_esm/Base58.js.map +1 -0
- package/_esm/Base64.js +236 -0
- package/_esm/Base64.js.map +1 -0
- package/_esm/Blobs.js +624 -0
- package/_esm/Blobs.js.map +1 -0
- package/_esm/Block.js +177 -0
- package/_esm/Block.js.map +1 -0
- package/_esm/Bloom.js +57 -0
- package/_esm/Bloom.js.map +1 -0
- package/_esm/Bls.js +141 -0
- package/_esm/Bls.js.map +1 -0
- package/_esm/BlsPoint.js +59 -0
- package/_esm/BlsPoint.js.map +1 -0
- package/_esm/Bytes.js +719 -0
- package/_esm/Bytes.js.map +1 -0
- package/_esm/Caches.js +19 -0
- package/_esm/Caches.js.map +1 -0
- package/_esm/ContractAddress.js +110 -0
- package/_esm/ContractAddress.js.map +1 -0
- package/_esm/Ens.js +84 -0
- package/_esm/Ens.js.map +1 -0
- package/_esm/Errors.js +105 -0
- package/_esm/Errors.js.map +1 -0
- package/_esm/Fee.js +2 -0
- package/_esm/Fee.js.map +1 -0
- package/_esm/Filter.js +100 -0
- package/_esm/Filter.js.map +1 -0
- package/_esm/Hash.js +126 -0
- package/_esm/Hash.js.map +1 -0
- package/_esm/HdKey.js +107 -0
- package/_esm/HdKey.js.map +1 -0
- package/_esm/Hex.js +763 -0
- package/_esm/Hex.js.map +1 -0
- package/_esm/Json.js +62 -0
- package/_esm/Json.js.map +1 -0
- package/_esm/Kzg.js +30 -0
- package/_esm/Kzg.js.map +1 -0
- package/_esm/Log.js +181 -0
- package/_esm/Log.js.map +1 -0
- package/_esm/Mnemonic.js +154 -0
- package/_esm/Mnemonic.js.map +1 -0
- package/_esm/P256.js +131 -0
- package/_esm/P256.js.map +1 -0
- package/_esm/PersonalMessage.js +46 -0
- package/_esm/PersonalMessage.js.map +1 -0
- package/_esm/Provider.js +122 -0
- package/_esm/Provider.js.map +1 -0
- package/_esm/PublicKey.js +395 -0
- package/_esm/PublicKey.js.map +1 -0
- package/_esm/Rlp.js +267 -0
- package/_esm/Rlp.js.map +1 -0
- package/_esm/RpcRequest.js +131 -0
- package/_esm/RpcRequest.js.map +1 -0
- package/_esm/RpcResponse.js +457 -0
- package/_esm/RpcResponse.js.map +1 -0
- package/_esm/RpcSchema.js +46 -0
- package/_esm/RpcSchema.js.map +1 -0
- package/_esm/RpcTransport.js +110 -0
- package/_esm/RpcTransport.js.map +1 -0
- package/_esm/Secp256k1.js +173 -0
- package/_esm/Secp256k1.js.map +1 -0
- package/_esm/Signature.js +696 -0
- package/_esm/Signature.js.map +1 -0
- package/_esm/Siwe.js +374 -0
- package/_esm/Siwe.js.map +1 -0
- package/_esm/Solidity.js +104 -0
- package/_esm/Solidity.js.map +1 -0
- package/_esm/Transaction.js +176 -0
- package/_esm/Transaction.js.map +1 -0
- package/_esm/TransactionEnvelope.js +139 -0
- package/_esm/TransactionEnvelope.js.map +1 -0
- package/_esm/TransactionEnvelopeEip1559.js +455 -0
- package/_esm/TransactionEnvelopeEip1559.js.map +1 -0
- package/_esm/TransactionEnvelopeEip2930.js +439 -0
- package/_esm/TransactionEnvelopeEip2930.js.map +1 -0
- package/_esm/TransactionEnvelopeEip4844.js +542 -0
- package/_esm/TransactionEnvelopeEip4844.js.map +1 -0
- package/_esm/TransactionEnvelopeEip7702.js +442 -0
- package/_esm/TransactionEnvelopeEip7702.js.map +1 -0
- package/_esm/TransactionEnvelopeLegacy.js +495 -0
- package/_esm/TransactionEnvelopeLegacy.js.map +1 -0
- package/_esm/TransactionReceipt.js +229 -0
- package/_esm/TransactionReceipt.js.map +1 -0
- package/_esm/TransactionRequest.js +89 -0
- package/_esm/TransactionRequest.js.map +1 -0
- package/_esm/TypedData.js +635 -0
- package/_esm/TypedData.js.map +1 -0
- package/_esm/ValidatorData.js +52 -0
- package/_esm/ValidatorData.js.map +1 -0
- package/_esm/Value.js +196 -0
- package/_esm/Value.js.map +1 -0
- package/_esm/WebAuthnP256.js +471 -0
- package/_esm/WebAuthnP256.js.map +1 -0
- package/_esm/WebCryptoP256.js +116 -0
- package/_esm/WebCryptoP256.js.map +1 -0
- package/_esm/Withdrawal.js +72 -0
- package/_esm/Withdrawal.js.map +1 -0
- package/_esm/index.js +3366 -0
- package/_esm/index.js.map +1 -0
- package/_esm/internal/abi.js +9 -0
- package/_esm/internal/abi.js.map +1 -0
- package/_esm/internal/abiConstructor.js +2 -0
- package/_esm/internal/abiConstructor.js.map +1 -0
- package/_esm/internal/abiError.js +2 -0
- package/_esm/internal/abiError.js.map +1 -0
- package/_esm/internal/abiEvent.js +2 -0
- package/_esm/internal/abiEvent.js.map +1 -0
- package/_esm/internal/abiFunction.js +2 -0
- package/_esm/internal/abiFunction.js.map +1 -0
- package/_esm/internal/abiItem.js +122 -0
- package/_esm/internal/abiItem.js.map +1 -0
- package/_esm/internal/abiParameters.js +419 -0
- package/_esm/internal/abiParameters.js.map +1 -0
- package/_esm/internal/base58.js +91 -0
- package/_esm/internal/base58.js.map +1 -0
- package/_esm/internal/bytes.js +86 -0
- package/_esm/internal/bytes.js.map +1 -0
- package/_esm/internal/cursor.js +207 -0
- package/_esm/internal/cursor.js.map +1 -0
- package/_esm/internal/ens.js +47 -0
- package/_esm/internal/ens.js.map +1 -0
- package/_esm/internal/errors.js +26 -0
- package/_esm/internal/errors.js.map +1 -0
- package/_esm/internal/hdKey.js +17 -0
- package/_esm/internal/hdKey.js.map +1 -0
- package/_esm/internal/hex.js +64 -0
- package/_esm/internal/hex.js.map +1 -0
- package/_esm/internal/lru.js +36 -0
- package/_esm/internal/lru.js.map +1 -0
- package/_esm/internal/mnemonic/wordlists.js +11 -0
- package/_esm/internal/mnemonic/wordlists.js.map +1 -0
- package/_esm/internal/promise.js +52 -0
- package/_esm/internal/promise.js.map +1 -0
- package/_esm/internal/register.js +2 -0
- package/_esm/internal/register.js.map +1 -0
- package/_esm/internal/rpcSchema.js +2 -0
- package/_esm/internal/rpcSchema.js.map +1 -0
- package/_esm/internal/rpcSchemas/eth.js +2 -0
- package/_esm/internal/rpcSchemas/eth.js.map +1 -0
- package/_esm/internal/rpcSchemas/wallet.js +2 -0
- package/_esm/internal/rpcSchemas/wallet.js.map +1 -0
- package/_esm/internal/rpcTransport.js +20 -0
- package/_esm/internal/rpcTransport.js.map +1 -0
- package/_esm/internal/types.js +2 -0
- package/_esm/internal/types.js.map +1 -0
- package/_esm/internal/uid.js +15 -0
- package/_esm/internal/uid.js.map +1 -0
- package/_esm/internal/webauthn.js +35 -0
- package/_esm/internal/webauthn.js.map +1 -0
- package/_esm/package.json +1 -0
- package/_esm/trusted-setups/Paths.js +3 -0
- package/_esm/trusted-setups/Paths.js.map +1 -0
- package/_esm/trusted-setups/index.js +2 -0
- package/_esm/trusted-setups/index.js.map +1 -0
- package/_esm/trusted-setups/internal/paths.js +12 -0
- package/_esm/trusted-setups/internal/paths.js.map +1 -0
- package/_esm/version.js +3 -0
- package/_esm/version.js.map +1 -0
- package/_esm/window/index.js +2 -0
- package/_esm/window/index.js.map +1 -0
- package/_test/Abi.test-d/package.json +6 -0
- package/_test/AbiConstructor.test-d/package.json +6 -0
- package/_test/AbiError.test-d/package.json +6 -0
- package/_test/AbiEvent.snap-d/package.json +6 -0
- package/_test/AbiEvent.snap-d.ts +329 -0
- package/_test/AbiFunction.snap-d/package.json +6 -0
- package/_test/AbiFunction.snap-d.ts +262 -0
- package/_test/AbiItem.snap-d/package.json +6 -0
- package/_test/AbiItem.snap-d.ts +131 -0
- package/_test/AbiParameters.bench/package.json +6 -0
- package/_test/AbiParameters.snap-d/package.json +6 -0
- package/_test/AbiParameters.snap-d.ts +66 -0
- package/_test/Address.bench/package.json +6 -0
- package/_test/Base58.bench/package.json +6 -0
- package/_test/Hex.bench/package.json +6 -0
- package/_test/Hex.test-d/package.json +6 -0
- package/_test/PublicKey.test-d/package.json +6 -0
- package/_test/Rlp.bench/package.json +6 -0
- package/_test/Rlp.test-d/package.json +6 -0
- package/_test/Signature.snap-d/package.json +6 -0
- package/_test/Signature.snap-d.ts +96 -0
- package/_test/TransactionEnvelopeEip1559.test-d/package.json +6 -0
- package/_test/TransactionEnvelopeEip2930.test-d/package.json +6 -0
- package/_test/TransactionEnvelopeEip4844.test-d/package.json +6 -0
- package/_test/TransactionEnvelopeEip7702.test-d/package.json +6 -0
- package/_test/TransactionEnvelopeLegacy.test-d/package.json +6 -0
- package/_test/TypedData.test-d/package.json +6 -0
- package/_types/Abi.d.ts +137 -0
- package/_types/Abi.d.ts.map +1 -0
- package/_types/AbiConstructor.d.ts +305 -0
- package/_types/AbiConstructor.d.ts.map +1 -0
- package/_types/AbiError.d.ts +522 -0
- package/_types/AbiError.d.ts.map +1 -0
- package/_types/AbiEvent.d.ts +892 -0
- package/_types/AbiEvent.d.ts.map +1 -0
- package/_types/AbiFunction.d.ts +602 -0
- package/_types/AbiFunction.d.ts.map +1 -0
- package/_types/AbiItem.d.ts +544 -0
- package/_types/AbiItem.d.ts.map +1 -0
- package/_types/AbiParameters.d.ts +466 -0
- package/_types/AbiParameters.d.ts.map +1 -0
- package/_types/AccessList.d.ts +83 -0
- package/_types/AccessList.d.ts.map +1 -0
- package/_types/AccountProof.d.ts +32 -0
- package/_types/AccountProof.d.ts.map +1 -0
- package/_types/Address.d.ts +244 -0
- package/_types/Address.d.ts.map +1 -0
- package/_types/AesGcm.d.ts +116 -0
- package/_types/AesGcm.d.ts.map +1 -0
- package/_types/Authorization.d.ts +461 -0
- package/_types/Authorization.d.ts.map +1 -0
- package/_types/Base58.d.ts +131 -0
- package/_types/Base58.d.ts.map +1 -0
- package/_types/Base64.d.ts +244 -0
- package/_types/Base64.d.ts.map +1 -0
- package/_types/Blobs.d.ts +556 -0
- package/_types/Blobs.d.ts.map +1 -0
- package/_types/Block.d.ts +190 -0
- package/_types/Block.d.ts.map +1 -0
- package/_types/Bloom.d.ts +54 -0
- package/_types/Bloom.d.ts.map +1 -0
- package/_types/Bls.d.ts +365 -0
- package/_types/Bls.d.ts.map +1 -0
- package/_types/BlsPoint.d.ts +187 -0
- package/_types/BlsPoint.d.ts.map +1 -0
- package/_types/Bytes.d.ts +674 -0
- package/_types/Bytes.d.ts.map +1 -0
- package/_types/Caches.d.ts +13 -0
- package/_types/Caches.d.ts.map +1 -0
- package/_types/ContractAddress.d.ts +115 -0
- package/_types/ContractAddress.d.ts.map +1 -0
- package/_types/Ens.d.ts +72 -0
- package/_types/Ens.d.ts.map +1 -0
- package/_types/Errors.d.ts +33 -0
- package/_types/Errors.d.ts.map +1 -0
- package/_types/Fee.d.ts +41 -0
- package/_types/Fee.d.ts.map +1 -0
- package/_types/Filter.d.ts +100 -0
- package/_types/Filter.d.ts.map +1 -0
- package/_types/Hash.d.ts +135 -0
- package/_types/Hash.d.ts.map +1 -0
- package/_types/HdKey.d.ts +146 -0
- package/_types/HdKey.d.ts.map +1 -0
- package/_types/Hex.d.ts +711 -0
- package/_types/Hex.d.ts.map +1 -0
- package/_types/Json.d.ts +53 -0
- package/_types/Json.d.ts.map +1 -0
- package/_types/Kzg.d.ts +42 -0
- package/_types/Kzg.d.ts.map +1 -0
- package/_types/Log.d.ts +194 -0
- package/_types/Log.d.ts.map +1 -0
- package/_types/Mnemonic.d.ts +176 -0
- package/_types/Mnemonic.d.ts.map +1 -0
- package/_types/P256.d.ts +207 -0
- package/_types/P256.d.ts.map +1 -0
- package/_types/PersonalMessage.d.ts +49 -0
- package/_types/PersonalMessage.d.ts.map +1 -0
- package/_types/Provider.d.ts +268 -0
- package/_types/Provider.d.ts.map +1 -0
- package/_types/PublicKey.d.ts +327 -0
- package/_types/PublicKey.d.ts.map +1 -0
- package/_types/Rlp.d.ts +153 -0
- package/_types/Rlp.d.ts.map +1 -0
- package/_types/RpcRequest.d.ts +144 -0
- package/_types/RpcRequest.d.ts.map +1 -0
- package/_types/RpcResponse.d.ts +266 -0
- package/_types/RpcResponse.d.ts.map +1 -0
- package/_types/RpcSchema.d.ts +248 -0
- package/_types/RpcSchema.d.ts.map +1 -0
- package/_types/RpcTransport.d.ts +65 -0
- package/_types/RpcTransport.d.ts.map +1 -0
- package/_types/Secp256k1.d.ts +277 -0
- package/_types/Secp256k1.d.ts.map +1 -0
- package/_types/Signature.d.ts +601 -0
- package/_types/Signature.d.ts.map +1 -0
- package/_types/Siwe.d.ts +249 -0
- package/_types/Siwe.d.ts.map +1 -0
- package/_types/Solidity.d.ts +100 -0
- package/_types/Solidity.d.ts.map +1 -0
- package/_types/Transaction.d.ts +235 -0
- package/_types/Transaction.d.ts.map +1 -0
- package/_types/TransactionEnvelope.d.ts +141 -0
- package/_types/TransactionEnvelope.d.ts.map +1 -0
- package/_types/TransactionEnvelopeEip1559.d.ts +367 -0
- package/_types/TransactionEnvelopeEip1559.d.ts.map +1 -0
- package/_types/TransactionEnvelopeEip2930.d.ts +364 -0
- package/_types/TransactionEnvelopeEip2930.d.ts.map +1 -0
- package/_types/TransactionEnvelopeEip4844.d.ts +419 -0
- package/_types/TransactionEnvelopeEip4844.d.ts.map +1 -0
- package/_types/TransactionEnvelopeEip7702.d.ts +377 -0
- package/_types/TransactionEnvelopeEip7702.d.ts.map +1 -0
- package/_types/TransactionEnvelopeLegacy.d.ts +358 -0
- package/_types/TransactionEnvelopeLegacy.d.ts.map +1 -0
- package/_types/TransactionReceipt.d.ts +271 -0
- package/_types/TransactionReceipt.d.ts.map +1 -0
- package/_types/TransactionRequest.d.ts +92 -0
- package/_types/TransactionRequest.d.ts.map +1 -0
- package/_types/TypedData.d.ts +496 -0
- package/_types/TypedData.d.ts.map +1 -0
- package/_types/ValidatorData.d.ts +64 -0
- package/_types/ValidatorData.d.ts.map +1 -0
- package/_types/Value.d.ts +159 -0
- package/_types/Value.d.ts.map +1 -0
- package/_types/WebAuthnP256.d.ts +445 -0
- package/_types/WebAuthnP256.d.ts.map +1 -0
- package/_types/WebCryptoP256.d.ts +119 -0
- package/_types/WebCryptoP256.d.ts.map +1 -0
- package/_types/Withdrawal.d.ts +74 -0
- package/_types/Withdrawal.d.ts.map +1 -0
- package/_types/index.d.ts +3367 -0
- package/_types/index.d.ts.map +1 -0
- package/_types/internal/abi.d.ts +4 -0
- package/_types/internal/abi.d.ts.map +1 -0
- package/_types/internal/abiConstructor.d.ts +11 -0
- package/_types/internal/abiConstructor.d.ts.map +1 -0
- package/_types/internal/abiError.d.ts +11 -0
- package/_types/internal/abiError.d.ts.map +1 -0
- package/_types/internal/abiEvent.d.ts +60 -0
- package/_types/internal/abiEvent.d.ts.map +1 -0
- package/_types/internal/abiFunction.d.ts +11 -0
- package/_types/internal/abiFunction.d.ts.map +1 -0
- package/_types/internal/abiItem.d.ts +100 -0
- package/_types/internal/abiItem.d.ts.map +1 -0
- package/_types/internal/abiParameters.d.ts +169 -0
- package/_types/internal/abiParameters.d.ts.map +1 -0
- package/_types/internal/base58.d.ts +17 -0
- package/_types/internal/base58.d.ts.map +1 -0
- package/_types/internal/bytes.d.ts +52 -0
- package/_types/internal/bytes.d.ts.map +1 -0
- package/_types/internal/cursor.d.ts +70 -0
- package/_types/internal/cursor.d.ts.map +1 -0
- package/_types/internal/ens.d.ts +23 -0
- package/_types/internal/ens.d.ts.map +1 -0
- package/_types/internal/errors.d.ts +7 -0
- package/_types/internal/errors.d.ts.map +1 -0
- package/_types/internal/hdKey.d.ts +10 -0
- package/_types/internal/hdKey.d.ts.map +1 -0
- package/_types/internal/hex.d.ts +39 -0
- package/_types/internal/hex.d.ts.map +1 -0
- package/_types/internal/lru.d.ts +13 -0
- package/_types/internal/lru.d.ts.map +1 -0
- package/_types/internal/mnemonic/wordlists.d.ts +11 -0
- package/_types/internal/mnemonic/wordlists.d.ts.map +1 -0
- package/_types/internal/promise.d.ts +27 -0
- package/_types/internal/promise.d.ts.map +1 -0
- package/_types/internal/register.d.ts +13 -0
- package/_types/internal/register.d.ts.map +1 -0
- package/_types/internal/rpcSchema.d.ts +12 -0
- package/_types/internal/rpcSchema.d.ts.map +1 -0
- package/_types/internal/rpcSchemas/eth.d.ts +718 -0
- package/_types/internal/rpcSchemas/eth.d.ts.map +1 -0
- package/_types/internal/rpcSchemas/wallet.d.ts +416 -0
- package/_types/internal/rpcSchemas/wallet.d.ts.map +1 -0
- package/_types/internal/rpcTransport.d.ts +38 -0
- package/_types/internal/rpcTransport.d.ts.map +1 -0
- package/_types/internal/types.d.ts +284 -0
- package/_types/internal/types.d.ts.map +1 -0
- package/_types/internal/uid.d.ts +3 -0
- package/_types/internal/uid.d.ts.map +1 -0
- package/_types/internal/webauthn.d.ts +127 -0
- package/_types/internal/webauthn.d.ts.map +1 -0
- package/_types/trusted-setups/Paths.d.ts +2 -0
- package/_types/trusted-setups/Paths.d.ts.map +1 -0
- package/_types/trusted-setups/index.d.ts +2 -0
- package/_types/trusted-setups/index.d.ts.map +1 -0
- package/_types/trusted-setups/internal/paths.d.ts +3 -0
- package/_types/trusted-setups/internal/paths.d.ts.map +1 -0
- package/_types/version.d.ts +3 -0
- package/_types/version.d.ts.map +1 -0
- package/_types/window/index.d.ts +7 -0
- package/_types/window/index.d.ts.map +1 -0
- package/index.ts +3427 -0
- package/internal/abi.ts +11 -0
- package/internal/abiConstructor.ts +32 -0
- package/internal/abiError.ts +30 -0
- package/internal/abiEvent.ts +154 -0
- package/internal/abiFunction.ts +32 -0
- package/internal/abiItem.ts +593 -0
- package/internal/abiParameters.ts +741 -0
- package/internal/base58.ts +106 -0
- package/internal/bytes.ts +152 -0
- package/internal/cursor.ts +252 -0
- package/internal/ens.ts +64 -0
- package/internal/errors.ts +26 -0
- package/internal/hdKey.ts +25 -0
- package/internal/hex.ts +123 -0
- package/internal/lru.ts +34 -0
- package/internal/mnemonic/wordlists.ts +10 -0
- package/internal/promise.ts +66 -0
- package/internal/register.ts +15 -0
- package/internal/rpcSchema.ts +20 -0
- package/internal/rpcSchemas/eth.ts +727 -0
- package/internal/rpcSchemas/wallet.ts +428 -0
- package/internal/rpcTransport.ts +74 -0
- package/internal/types.ts +414 -0
- package/internal/uid.ts +15 -0
- package/internal/webauthn.ts +198 -0
- package/package.json +500 -20
- package/trusted-setups/Paths/package.json +6 -0
- package/trusted-setups/Paths.ts +3 -0
- package/trusted-setups/index.ts +1 -0
- package/trusted-setups/internal/paths.ts +13 -0
- package/trusted-setups/internal/setups/mainnet.json +8265 -0
- package/trusted-setups/internal/setups/mainnet.txt +4163 -0
- package/trusted-setups/package.json +6 -0
- package/tsdoc.json +4 -0
- package/version/package.json +6 -0
- package/version.ts +2 -0
- package/window/index.ts +7 -0
- package/window/package.json +6 -0
- package/cl/ansiesc.js +0 -25
- package/cl/deps.js +0 -7
- package/cl/editor.js +0 -141
- package/cl/index.html +0 -19
- package/cl/ox.js +0 -44
- package/cl/socket.io.js +0 -1922
- package/cl/style.css +0 -37
- package/srv/deps.js +0 -88
- package/srv/httpSrv.js +0 -82
- package/srv/ox.js +0 -44
- package/srv/remoteXtermReq.js +0 -70
package/TypedData.ts
ADDED
|
@@ -0,0 +1,931 @@
|
|
|
1
|
+
import type * as abitype from 'abitype'
|
|
2
|
+
import * as AbiParameters from './AbiParameters.js'
|
|
3
|
+
import * as Address from './Address.js'
|
|
4
|
+
import * as Bytes from './Bytes.js'
|
|
5
|
+
import * as Errors from './Errors.js'
|
|
6
|
+
import * as Hash from './Hash.js'
|
|
7
|
+
import * as Hex from './Hex.js'
|
|
8
|
+
import * as Json from './Json.js'
|
|
9
|
+
import * as Solidity from './Solidity.js'
|
|
10
|
+
import type { Compute } from './internal/types.js'
|
|
11
|
+
|
|
12
|
+
export type TypedData = abitype.TypedData
|
|
13
|
+
export type Domain = abitype.TypedDataDomain
|
|
14
|
+
export type Parameter = abitype.TypedDataParameter
|
|
15
|
+
|
|
16
|
+
// TODO: Make reusable for Viem?
|
|
17
|
+
export type Definition<
|
|
18
|
+
typedData extends TypedData | Record<string, unknown> = TypedData,
|
|
19
|
+
primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,
|
|
20
|
+
///
|
|
21
|
+
primaryTypes = typedData extends TypedData ? keyof typedData : string,
|
|
22
|
+
> = primaryType extends 'EIP712Domain'
|
|
23
|
+
? EIP712DomainDefinition<typedData, primaryType>
|
|
24
|
+
: MessageDefinition<typedData, primaryType, primaryTypes>
|
|
25
|
+
|
|
26
|
+
export type EIP712DomainDefinition<
|
|
27
|
+
typedData extends TypedData | Record<string, unknown> = TypedData,
|
|
28
|
+
primaryType extends 'EIP712Domain' = 'EIP712Domain',
|
|
29
|
+
///
|
|
30
|
+
schema extends Record<string, unknown> = typedData extends TypedData
|
|
31
|
+
? abitype.TypedDataToPrimitiveTypes<typedData>
|
|
32
|
+
: Record<string, unknown>,
|
|
33
|
+
> = {
|
|
34
|
+
types?: typedData | undefined
|
|
35
|
+
} & {
|
|
36
|
+
primaryType:
|
|
37
|
+
| 'EIP712Domain'
|
|
38
|
+
| (primaryType extends 'EIP712Domain' ? primaryType : never)
|
|
39
|
+
domain: schema extends { EIP712Domain: infer domain }
|
|
40
|
+
? domain
|
|
41
|
+
: Compute<Domain>
|
|
42
|
+
message?: undefined
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type MessageDefinition<
|
|
46
|
+
typedData extends TypedData | Record<string, unknown> = TypedData,
|
|
47
|
+
primaryType extends keyof typedData = keyof typedData,
|
|
48
|
+
///
|
|
49
|
+
primaryTypes = typedData extends TypedData ? keyof typedData : string,
|
|
50
|
+
schema extends Record<string, unknown> = typedData extends TypedData
|
|
51
|
+
? abitype.TypedDataToPrimitiveTypes<typedData>
|
|
52
|
+
: Record<string, unknown>,
|
|
53
|
+
message = schema[primaryType extends keyof schema
|
|
54
|
+
? primaryType
|
|
55
|
+
: keyof schema],
|
|
56
|
+
> = {
|
|
57
|
+
types: typedData
|
|
58
|
+
} & {
|
|
59
|
+
primaryType:
|
|
60
|
+
| primaryTypes // show all values
|
|
61
|
+
| (primaryType extends primaryTypes ? primaryType : never) // infer value
|
|
62
|
+
domain?:
|
|
63
|
+
| (schema extends { EIP712Domain: infer domain } ? domain : Compute<Domain>)
|
|
64
|
+
| undefined
|
|
65
|
+
message: { [_: string]: any } extends message // Check if message was inferred
|
|
66
|
+
? Record<string, unknown>
|
|
67
|
+
: message
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Asserts that [EIP-712 Typed Data](https://eips.ethereum.org/EIPS/eip-712) is valid.
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```ts twoslash
|
|
75
|
+
* import { TypedData } from 'ox'
|
|
76
|
+
*
|
|
77
|
+
* TypedData.assert({
|
|
78
|
+
* domain: {
|
|
79
|
+
* name: 'Ether!',
|
|
80
|
+
* version: '1',
|
|
81
|
+
* chainId: 1,
|
|
82
|
+
* verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',
|
|
83
|
+
* },
|
|
84
|
+
* primaryType: 'Foo',
|
|
85
|
+
* types: {
|
|
86
|
+
* Foo: [
|
|
87
|
+
* { name: 'address', type: 'address' },
|
|
88
|
+
* { name: 'name', type: 'string' },
|
|
89
|
+
* { name: 'foo', type: 'string' },
|
|
90
|
+
* ],
|
|
91
|
+
* },
|
|
92
|
+
* message: {
|
|
93
|
+
* address: '0xb9CAB4F0E46F7F6b1024b5A7463734fa68E633f9',
|
|
94
|
+
* name: 'jxom',
|
|
95
|
+
* foo: '0xb9CAB4F0E46F7F6b1024b5A7463734fa68E633f9',
|
|
96
|
+
* },
|
|
97
|
+
* })
|
|
98
|
+
* ```
|
|
99
|
+
*
|
|
100
|
+
* @param value - The Typed Data to validate.
|
|
101
|
+
*/
|
|
102
|
+
export function assert<
|
|
103
|
+
const typedData extends TypedData | Record<string, unknown>,
|
|
104
|
+
primaryType extends keyof typedData | 'EIP712Domain',
|
|
105
|
+
>(value: assert.Value<typedData, primaryType>): void {
|
|
106
|
+
const { domain, message, primaryType, types } =
|
|
107
|
+
value as unknown as assert.Value
|
|
108
|
+
|
|
109
|
+
const validateData = (
|
|
110
|
+
struct: readonly Parameter[],
|
|
111
|
+
data: Record<string, unknown>,
|
|
112
|
+
) => {
|
|
113
|
+
for (const param of struct) {
|
|
114
|
+
const { name, type } = param
|
|
115
|
+
const value = data[name]
|
|
116
|
+
|
|
117
|
+
const integerMatch = type.match(Solidity.integerRegex)
|
|
118
|
+
if (
|
|
119
|
+
integerMatch &&
|
|
120
|
+
(typeof value === 'number' || typeof value === 'bigint')
|
|
121
|
+
) {
|
|
122
|
+
const [, base, size_] = integerMatch
|
|
123
|
+
// If number cannot be cast to a sized hex value, it is out of range
|
|
124
|
+
// and will throw.
|
|
125
|
+
Hex.fromNumber(value, {
|
|
126
|
+
signed: base === 'int',
|
|
127
|
+
size: Number.parseInt(size_ ?? '') / 8,
|
|
128
|
+
})
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (
|
|
132
|
+
type === 'address' &&
|
|
133
|
+
typeof value === 'string' &&
|
|
134
|
+
!Address.validate(value)
|
|
135
|
+
)
|
|
136
|
+
throw new Address.InvalidAddressError({
|
|
137
|
+
address: value,
|
|
138
|
+
cause: new Address.InvalidInputError(),
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
const bytesMatch = type.match(Solidity.bytesRegex)
|
|
142
|
+
if (bytesMatch) {
|
|
143
|
+
const [, size] = bytesMatch
|
|
144
|
+
if (size && Hex.size(value as Hex.Hex) !== Number.parseInt(size))
|
|
145
|
+
throw new BytesSizeMismatchError({
|
|
146
|
+
expectedSize: Number.parseInt(size),
|
|
147
|
+
givenSize: Hex.size(value as Hex.Hex),
|
|
148
|
+
})
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const struct = types[type]
|
|
152
|
+
if (struct) {
|
|
153
|
+
validateReference(type)
|
|
154
|
+
validateData(struct, value as Record<string, unknown>)
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Validate domain types.
|
|
160
|
+
if (types.EIP712Domain && domain) validateData(types.EIP712Domain, domain)
|
|
161
|
+
|
|
162
|
+
// Validate message types.
|
|
163
|
+
if (primaryType !== 'EIP712Domain') {
|
|
164
|
+
if (types[primaryType]) validateData(types[primaryType], message)
|
|
165
|
+
else throw new InvalidPrimaryTypeError({ primaryType, types })
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export declare namespace assert {
|
|
170
|
+
type Value<
|
|
171
|
+
typedData extends TypedData | Record<string, unknown> = TypedData,
|
|
172
|
+
primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,
|
|
173
|
+
> = Definition<typedData, primaryType>
|
|
174
|
+
|
|
175
|
+
type ErrorType =
|
|
176
|
+
| Address.InvalidAddressError
|
|
177
|
+
| BytesSizeMismatchError
|
|
178
|
+
| InvalidPrimaryTypeError
|
|
179
|
+
| Hex.fromNumber.ErrorType
|
|
180
|
+
| Hex.size.ErrorType
|
|
181
|
+
| Errors.GlobalErrorType
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
assert.parseError = (error: unknown) =>
|
|
185
|
+
/* v8 ignore next */
|
|
186
|
+
error as assert.ErrorType
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Creates [EIP-712 Typed Data](https://eips.ethereum.org/EIPS/eip-712) [`domainSeparator`](https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator) for the provided domain.
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* ```ts twoslash
|
|
193
|
+
* import { TypedData } from 'ox'
|
|
194
|
+
*
|
|
195
|
+
* TypedData.domainSeparator({
|
|
196
|
+
* name: 'Ether!',
|
|
197
|
+
* version: '1',
|
|
198
|
+
* chainId: 1,
|
|
199
|
+
* verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',
|
|
200
|
+
* })
|
|
201
|
+
* // @log: '0x9911ee4f58a7059a8f5385248040e6984d80e2c849500fe6a4d11c4fa98c2af3'
|
|
202
|
+
* ```
|
|
203
|
+
*
|
|
204
|
+
* @param domain - The domain for which to create the domain separator.
|
|
205
|
+
* @returns The domain separator.
|
|
206
|
+
*/
|
|
207
|
+
export function domainSeparator(domain: Domain): Hex.Hex {
|
|
208
|
+
return hashDomain({
|
|
209
|
+
domain,
|
|
210
|
+
})
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export declare namespace domainSeparator {
|
|
214
|
+
type ErrorType = hashDomain.ErrorType | Errors.GlobalErrorType
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
domainSeparator.parseError = (error: unknown) =>
|
|
218
|
+
/* v8 ignore next */
|
|
219
|
+
error as domainSeparator.ErrorType
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Encodes typed data in [EIP-712 format](https://eips.ethereum.org/EIPS/eip-712): `0x19 ‖ 0x01 ‖ domainSeparator ‖ hashStruct(message)`.
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* ```ts twoslash
|
|
226
|
+
* import { TypedData, Hash } from 'ox'
|
|
227
|
+
*
|
|
228
|
+
* const data = TypedData.encode({ // [!code focus:33]
|
|
229
|
+
* domain: {
|
|
230
|
+
* name: 'Ether Mail',
|
|
231
|
+
* version: '1',
|
|
232
|
+
* chainId: 1,
|
|
233
|
+
* verifyingContract: '0x0000000000000000000000000000000000000000',
|
|
234
|
+
* },
|
|
235
|
+
* types: {
|
|
236
|
+
* Person: [
|
|
237
|
+
* { name: 'name', type: 'string' },
|
|
238
|
+
* { name: 'wallet', type: 'address' },
|
|
239
|
+
* ],
|
|
240
|
+
* Mail: [
|
|
241
|
+
* { name: 'from', type: 'Person' },
|
|
242
|
+
* { name: 'to', type: 'Person' },
|
|
243
|
+
* { name: 'contents', type: 'string' },
|
|
244
|
+
* ],
|
|
245
|
+
* },
|
|
246
|
+
* primaryType: 'Mail',
|
|
247
|
+
* message: {
|
|
248
|
+
* from: {
|
|
249
|
+
* name: 'Cow',
|
|
250
|
+
* wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',
|
|
251
|
+
* },
|
|
252
|
+
* to: {
|
|
253
|
+
* name: 'Bob',
|
|
254
|
+
* wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',
|
|
255
|
+
* },
|
|
256
|
+
* contents: 'Hello, Bob!',
|
|
257
|
+
* },
|
|
258
|
+
* })
|
|
259
|
+
* // @log: '0x19012fdf3441fcaf4f30c7e16292b258a5d7054a4e2e00dbd7b7d2f467f2b8fb9413c52c0ee5d84264471806290a3f2c4cecfc5490626bf912d01f240d7a274b371e'
|
|
260
|
+
* // @log: (0x19 ‖ 0x01 ‖ domainSeparator ‖ hashStruct(message))
|
|
261
|
+
*
|
|
262
|
+
* const hash = Hash.keccak256(data)
|
|
263
|
+
* ```
|
|
264
|
+
*
|
|
265
|
+
* @param value - The Typed Data to encode.
|
|
266
|
+
* @returns The encoded Typed Data.
|
|
267
|
+
*/
|
|
268
|
+
export function encode<
|
|
269
|
+
const typedData extends TypedData | Record<string, unknown>,
|
|
270
|
+
primaryType extends keyof typedData | 'EIP712Domain',
|
|
271
|
+
>(value: encode.Value<typedData, primaryType>): Hex.Hex {
|
|
272
|
+
const { domain = {}, message, primaryType } = value as encode.Value
|
|
273
|
+
|
|
274
|
+
const types = {
|
|
275
|
+
EIP712Domain: extractEip712DomainTypes(domain),
|
|
276
|
+
...value.types,
|
|
277
|
+
} as TypedData
|
|
278
|
+
|
|
279
|
+
// Need to do a runtime validation check on addresses, byte ranges, integer ranges, etc
|
|
280
|
+
// as we can't statically check this with TypeScript.
|
|
281
|
+
assert({
|
|
282
|
+
domain,
|
|
283
|
+
message,
|
|
284
|
+
primaryType,
|
|
285
|
+
types,
|
|
286
|
+
})
|
|
287
|
+
|
|
288
|
+
// Typed Data Format: `0x19 ‖ 0x01 ‖ domainSeparator ‖ hashStruct(message)`
|
|
289
|
+
const parts: Hex.Hex[] = ['0x19', '0x01']
|
|
290
|
+
if (domain)
|
|
291
|
+
parts.push(
|
|
292
|
+
hashDomain({
|
|
293
|
+
domain,
|
|
294
|
+
types,
|
|
295
|
+
}),
|
|
296
|
+
)
|
|
297
|
+
if (primaryType !== 'EIP712Domain')
|
|
298
|
+
parts.push(
|
|
299
|
+
hashStruct({
|
|
300
|
+
data: message,
|
|
301
|
+
primaryType,
|
|
302
|
+
types,
|
|
303
|
+
}),
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
return Hex.concat(...parts)
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
export declare namespace encode {
|
|
310
|
+
type Value<
|
|
311
|
+
typedData extends TypedData | Record<string, unknown> = TypedData,
|
|
312
|
+
primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,
|
|
313
|
+
> = Definition<typedData, primaryType>
|
|
314
|
+
|
|
315
|
+
type ErrorType =
|
|
316
|
+
| extractEip712DomainTypes.ErrorType
|
|
317
|
+
| hashDomain.ErrorType
|
|
318
|
+
| hashStruct.ErrorType
|
|
319
|
+
| assert.ErrorType
|
|
320
|
+
| Errors.GlobalErrorType
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/* v8 ignore next */
|
|
324
|
+
encode.parseError = (error: unknown) => error as encode.ErrorType
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Encodes [EIP-712 Typed Data](https://eips.ethereum.org/EIPS/eip-712) schema for the provided primaryType.
|
|
328
|
+
*
|
|
329
|
+
* @example
|
|
330
|
+
* ```ts twoslash
|
|
331
|
+
* import { TypedData } from 'ox'
|
|
332
|
+
*
|
|
333
|
+
* TypedData.encodeType({
|
|
334
|
+
* types: {
|
|
335
|
+
* Foo: [
|
|
336
|
+
* { name: 'address', type: 'address' },
|
|
337
|
+
* { name: 'name', type: 'string' },
|
|
338
|
+
* { name: 'foo', type: 'string' },
|
|
339
|
+
* ],
|
|
340
|
+
* },
|
|
341
|
+
* primaryType: 'Foo',
|
|
342
|
+
* })
|
|
343
|
+
* // @log: 'Foo(address address,string name,string foo)'
|
|
344
|
+
* ```
|
|
345
|
+
*
|
|
346
|
+
* @param value - The Typed Data schema.
|
|
347
|
+
* @returns The encoded type.
|
|
348
|
+
*/
|
|
349
|
+
export function encodeType(value: encodeType.Value): string {
|
|
350
|
+
const { primaryType, types } = value
|
|
351
|
+
|
|
352
|
+
let result = ''
|
|
353
|
+
const unsortedDeps = findTypeDependencies({ primaryType, types })
|
|
354
|
+
unsortedDeps.delete(primaryType)
|
|
355
|
+
|
|
356
|
+
const deps = [primaryType, ...Array.from(unsortedDeps).sort()]
|
|
357
|
+
for (const type of deps) {
|
|
358
|
+
result += `${type}(${(types[type] ?? [])
|
|
359
|
+
.map(({ name, type: t }) => `${t} ${name}`)
|
|
360
|
+
.join(',')})`
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
return result
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
export declare namespace encodeType {
|
|
367
|
+
type Value = {
|
|
368
|
+
primaryType: string
|
|
369
|
+
types: TypedData
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
type ErrorType = findTypeDependencies.ErrorType | Errors.GlobalErrorType
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/* v8 ignore next */
|
|
376
|
+
encodeType.parseError = (error: unknown) => error as encodeType.ErrorType
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Gets [EIP-712 Typed Data](https://eips.ethereum.org/EIPS/eip-712) schema for EIP-721 domain.
|
|
380
|
+
*
|
|
381
|
+
* @example
|
|
382
|
+
* ```ts twoslash
|
|
383
|
+
* import { TypedData } from 'ox'
|
|
384
|
+
*
|
|
385
|
+
* TypedData.extractEip712DomainTypes({
|
|
386
|
+
* name: 'Ether!',
|
|
387
|
+
* version: '1',
|
|
388
|
+
* chainId: 1,
|
|
389
|
+
* verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',
|
|
390
|
+
* })
|
|
391
|
+
* // @log: [
|
|
392
|
+
* // @log: { 'name': 'name', 'type': 'string' },
|
|
393
|
+
* // @log: { 'name': 'version', 'type': 'string' },
|
|
394
|
+
* // @log: { 'name': 'chainId', 'type': 'uint256' },
|
|
395
|
+
* // @log: { 'name': 'verifyingContract', 'type': 'address' },
|
|
396
|
+
* // @log: ]
|
|
397
|
+
* ```
|
|
398
|
+
*
|
|
399
|
+
* @param domain - The EIP-712 domain.
|
|
400
|
+
* @returns The EIP-712 domain schema.
|
|
401
|
+
*/
|
|
402
|
+
export function extractEip712DomainTypes(
|
|
403
|
+
domain: Domain | undefined,
|
|
404
|
+
): Parameter[] {
|
|
405
|
+
return [
|
|
406
|
+
typeof domain?.name === 'string' && { name: 'name', type: 'string' },
|
|
407
|
+
domain?.version && { name: 'version', type: 'string' },
|
|
408
|
+
typeof domain?.chainId === 'number' && {
|
|
409
|
+
name: 'chainId',
|
|
410
|
+
type: 'uint256',
|
|
411
|
+
},
|
|
412
|
+
domain?.verifyingContract && {
|
|
413
|
+
name: 'verifyingContract',
|
|
414
|
+
type: 'address',
|
|
415
|
+
},
|
|
416
|
+
domain?.salt && { name: 'salt', type: 'bytes32' },
|
|
417
|
+
].filter(Boolean) as Parameter[]
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
export declare namespace extractEip712DomainTypes {
|
|
421
|
+
type ErrorType = Errors.GlobalErrorType
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
extractEip712DomainTypes.parseError = (error: unknown) =>
|
|
425
|
+
/* v8 ignore next */
|
|
426
|
+
error as extractEip712DomainTypes.ErrorType
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Gets the payload to use for signing typed data in [EIP-712 format](https://eips.ethereum.org/EIPS/eip-712).
|
|
430
|
+
*
|
|
431
|
+
* @example
|
|
432
|
+
* ```ts twoslash
|
|
433
|
+
* import { Secp256k1, TypedData, Hash } from 'ox'
|
|
434
|
+
*
|
|
435
|
+
* const payload = TypedData.getSignPayload({ // [!code focus:99]
|
|
436
|
+
* domain: {
|
|
437
|
+
* name: 'Ether Mail',
|
|
438
|
+
* version: '1',
|
|
439
|
+
* chainId: 1,
|
|
440
|
+
* verifyingContract: '0x0000000000000000000000000000000000000000',
|
|
441
|
+
* },
|
|
442
|
+
* types: {
|
|
443
|
+
* Person: [
|
|
444
|
+
* { name: 'name', type: 'string' },
|
|
445
|
+
* { name: 'wallet', type: 'address' },
|
|
446
|
+
* ],
|
|
447
|
+
* Mail: [
|
|
448
|
+
* { name: 'from', type: 'Person' },
|
|
449
|
+
* { name: 'to', type: 'Person' },
|
|
450
|
+
* { name: 'contents', type: 'string' },
|
|
451
|
+
* ],
|
|
452
|
+
* },
|
|
453
|
+
* primaryType: 'Mail',
|
|
454
|
+
* message: {
|
|
455
|
+
* from: {
|
|
456
|
+
* name: 'Cow',
|
|
457
|
+
* wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',
|
|
458
|
+
* },
|
|
459
|
+
* to: {
|
|
460
|
+
* name: 'Bob',
|
|
461
|
+
* wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',
|
|
462
|
+
* },
|
|
463
|
+
* contents: 'Hello, Bob!',
|
|
464
|
+
* },
|
|
465
|
+
* })
|
|
466
|
+
*
|
|
467
|
+
* const signature = Secp256k1.sign({ payload, privateKey: '0x...' })
|
|
468
|
+
* ```
|
|
469
|
+
*
|
|
470
|
+
* @param value - The typed data to get the sign payload for.
|
|
471
|
+
* @returns The payload to use for signing.
|
|
472
|
+
*/
|
|
473
|
+
export function getSignPayload<
|
|
474
|
+
const typedData extends TypedData | Record<string, unknown>,
|
|
475
|
+
primaryType extends keyof typedData | 'EIP712Domain',
|
|
476
|
+
>(value: encode.Value<typedData, primaryType>): Hex.Hex {
|
|
477
|
+
return Hash.keccak256(encode(value))
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
export declare namespace getSignPayload {
|
|
481
|
+
type ErrorType =
|
|
482
|
+
| Hash.keccak256.ErrorType
|
|
483
|
+
| encode.ErrorType
|
|
484
|
+
| Errors.GlobalErrorType
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
getSignPayload.parseError = (error: unknown) =>
|
|
488
|
+
/* v8 ignore next */
|
|
489
|
+
error as getSignPayload.ErrorType
|
|
490
|
+
|
|
491
|
+
/**
|
|
492
|
+
* Hashes [EIP-712 Typed Data](https://eips.ethereum.org/EIPS/eip-712) domain.
|
|
493
|
+
*
|
|
494
|
+
* @example
|
|
495
|
+
* ```ts twoslash
|
|
496
|
+
* import { TypedData } from 'ox'
|
|
497
|
+
*
|
|
498
|
+
* TypedData.hashDomain({
|
|
499
|
+
* domain: {
|
|
500
|
+
* name: 'Ether Mail',
|
|
501
|
+
* version: '1',
|
|
502
|
+
* chainId: 1,
|
|
503
|
+
* verifyingContract: '0x0000000000000000000000000000000000000000',
|
|
504
|
+
* },
|
|
505
|
+
* })
|
|
506
|
+
* // @log: '0x6192106f129ce05c9075d319c1fa6ea9b3ae37cbd0c1ef92e2be7137bb07baa1'
|
|
507
|
+
* ```
|
|
508
|
+
*
|
|
509
|
+
* @param value - The Typed Data domain and types.
|
|
510
|
+
* @returns The hashed domain.
|
|
511
|
+
*/
|
|
512
|
+
export function hashDomain(value: hashDomain.Value): Hex.Hex {
|
|
513
|
+
const { domain, types } = value
|
|
514
|
+
return hashStruct({
|
|
515
|
+
data: domain,
|
|
516
|
+
primaryType: 'EIP712Domain',
|
|
517
|
+
types: {
|
|
518
|
+
...types,
|
|
519
|
+
EIP712Domain: types?.EIP712Domain || extractEip712DomainTypes(domain),
|
|
520
|
+
},
|
|
521
|
+
})
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
export declare namespace hashDomain {
|
|
525
|
+
type Value = {
|
|
526
|
+
/** The Typed Data domain. */
|
|
527
|
+
domain: Domain
|
|
528
|
+
/** The Typed Data types. */
|
|
529
|
+
types?:
|
|
530
|
+
| {
|
|
531
|
+
EIP712Domain?: readonly Parameter[] | undefined
|
|
532
|
+
[key: string]: readonly Parameter[] | undefined
|
|
533
|
+
}
|
|
534
|
+
| undefined
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
type ErrorType = hashStruct.ErrorType | Errors.GlobalErrorType
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
/* v8 ignore next */
|
|
541
|
+
hashDomain.parseError = (error: unknown) => error as hashDomain.ErrorType
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* Hashes [EIP-712 Typed Data](https://eips.ethereum.org/EIPS/eip-712) struct.
|
|
545
|
+
*
|
|
546
|
+
* @example
|
|
547
|
+
* ```ts twoslash
|
|
548
|
+
* import { TypedData } from 'ox'
|
|
549
|
+
*
|
|
550
|
+
* TypedData.hashStruct({
|
|
551
|
+
* types: {
|
|
552
|
+
* Foo: [
|
|
553
|
+
* { name: 'address', type: 'address' },
|
|
554
|
+
* { name: 'name', type: 'string' },
|
|
555
|
+
* { name: 'foo', type: 'string' },
|
|
556
|
+
* ],
|
|
557
|
+
* },
|
|
558
|
+
* primaryType: 'Foo',
|
|
559
|
+
* data: {
|
|
560
|
+
* address: '0xb9CAB4F0E46F7F6b1024b5A7463734fa68E633f9',
|
|
561
|
+
* name: 'jxom',
|
|
562
|
+
* foo: '0xb9CAB4F0E46F7F6b1024b5A7463734fa68E633f9',
|
|
563
|
+
* },
|
|
564
|
+
* })
|
|
565
|
+
* // @log: '0x996fb3b6d48c50312d69abdd4c1b6fb02057c85aa86bb8d04c6f023326a168ce'
|
|
566
|
+
* ```
|
|
567
|
+
*
|
|
568
|
+
* @param value - The Typed Data struct to hash.
|
|
569
|
+
* @returns The hashed Typed Data struct.
|
|
570
|
+
*/
|
|
571
|
+
export function hashStruct(value: hashStruct.Value): Hex.Hex {
|
|
572
|
+
const { data, primaryType, types } = value
|
|
573
|
+
const encoded = encodeData({
|
|
574
|
+
data,
|
|
575
|
+
primaryType,
|
|
576
|
+
types,
|
|
577
|
+
})
|
|
578
|
+
return Hash.keccak256(encoded)
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
export declare namespace hashStruct {
|
|
582
|
+
type Value = {
|
|
583
|
+
/** The Typed Data struct to hash. */
|
|
584
|
+
data: Record<string, unknown>
|
|
585
|
+
/** The primary type of the Typed Data struct. */
|
|
586
|
+
primaryType: string
|
|
587
|
+
/** The types of the Typed Data struct. */
|
|
588
|
+
types: TypedData
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
type ErrorType =
|
|
592
|
+
| encodeData.ErrorType
|
|
593
|
+
| Hash.keccak256.ErrorType
|
|
594
|
+
| Errors.GlobalErrorType
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/* v8 ignore next */
|
|
598
|
+
hashStruct.parseError = (error: unknown) => error as hashStruct.ErrorType
|
|
599
|
+
|
|
600
|
+
/**
|
|
601
|
+
* Serializes [EIP-712 Typed Data](https://eips.ethereum.org/EIPS/eip-712) schema into string.
|
|
602
|
+
*
|
|
603
|
+
* @example
|
|
604
|
+
* ```ts twoslash
|
|
605
|
+
* import { TypedData } from 'ox'
|
|
606
|
+
*
|
|
607
|
+
* TypedData.serialize({
|
|
608
|
+
* domain: {
|
|
609
|
+
* name: 'Ether!',
|
|
610
|
+
* version: '1',
|
|
611
|
+
* chainId: 1,
|
|
612
|
+
* verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',
|
|
613
|
+
* },
|
|
614
|
+
* primaryType: 'Foo',
|
|
615
|
+
* types: {
|
|
616
|
+
* Foo: [
|
|
617
|
+
* { name: 'address', type: 'address' },
|
|
618
|
+
* { name: 'name', type: 'string' },
|
|
619
|
+
* { name: 'foo', type: 'string' },
|
|
620
|
+
* ],
|
|
621
|
+
* },
|
|
622
|
+
* message: {
|
|
623
|
+
* address: '0xb9CAB4F0E46F7F6b1024b5A7463734fa68E633f9',
|
|
624
|
+
* name: 'jxom',
|
|
625
|
+
* foo: '0xb9CAB4F0E46F7F6b1024b5A7463734fa68E633f9',
|
|
626
|
+
* },
|
|
627
|
+
* })
|
|
628
|
+
* // @log: "{"domain":{},"message":{"address":"0xb9cab4f0e46f7f6b1024b5a7463734fa68e633f9","name":"jxom","foo":"0xb9CAB4F0E46F7F6b1024b5A7463734fa68E633f9"},"primaryType":"Foo","types":{"Foo":[{"name":"address","type":"address"},{"name":"name","type":"string"},{"name":"foo","type":"string"}]}}"
|
|
629
|
+
* ```
|
|
630
|
+
*
|
|
631
|
+
* @param value - The Typed Data schema to serialize.
|
|
632
|
+
* @returns The serialized Typed Data schema. w
|
|
633
|
+
*/
|
|
634
|
+
export function serialize<
|
|
635
|
+
const typedData extends TypedData | Record<string, unknown>,
|
|
636
|
+
primaryType extends keyof typedData | 'EIP712Domain',
|
|
637
|
+
>(value: serialize.Value<typedData, primaryType>): string {
|
|
638
|
+
const {
|
|
639
|
+
domain: domain_,
|
|
640
|
+
message: message_,
|
|
641
|
+
primaryType,
|
|
642
|
+
types,
|
|
643
|
+
} = value as unknown as serialize.Value
|
|
644
|
+
|
|
645
|
+
const normalizeData = (
|
|
646
|
+
struct: readonly Parameter[],
|
|
647
|
+
value: Record<string, unknown>,
|
|
648
|
+
) => {
|
|
649
|
+
const data = { ...value }
|
|
650
|
+
for (const param of struct) {
|
|
651
|
+
const { name, type } = param
|
|
652
|
+
if (type === 'address') data[name] = (data[name] as string).toLowerCase()
|
|
653
|
+
}
|
|
654
|
+
return data
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
const domain = (() => {
|
|
658
|
+
if (!types.EIP712Domain) return {}
|
|
659
|
+
if (!domain_) return {}
|
|
660
|
+
return normalizeData(types.EIP712Domain, domain_)
|
|
661
|
+
})()
|
|
662
|
+
|
|
663
|
+
const message = (() => {
|
|
664
|
+
if (primaryType === 'EIP712Domain') return undefined
|
|
665
|
+
if (!types[primaryType]) return {}
|
|
666
|
+
return normalizeData(types[primaryType], message_)
|
|
667
|
+
})()
|
|
668
|
+
|
|
669
|
+
return Json.stringify({ domain, message, primaryType, types }, (_, value) => {
|
|
670
|
+
if (typeof value === 'bigint') return value.toString()
|
|
671
|
+
return value
|
|
672
|
+
})
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
export declare namespace serialize {
|
|
676
|
+
type Value<
|
|
677
|
+
typedData extends TypedData | Record<string, unknown> = TypedData,
|
|
678
|
+
primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,
|
|
679
|
+
> = Definition<typedData, primaryType>
|
|
680
|
+
|
|
681
|
+
type ErrorType = Json.stringify.ErrorType | Errors.GlobalErrorType
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
serialize.parseError = (error: unknown) =>
|
|
685
|
+
/* v8 ignore next */
|
|
686
|
+
error as serialize.ErrorType
|
|
687
|
+
|
|
688
|
+
/**
|
|
689
|
+
* Checks if [EIP-712 Typed Data](https://eips.ethereum.org/EIPS/eip-712) is valid.
|
|
690
|
+
*
|
|
691
|
+
* @example
|
|
692
|
+
* ```ts twoslash
|
|
693
|
+
* import { TypedData } from 'ox'
|
|
694
|
+
*
|
|
695
|
+
* const valid = TypedData.validate({
|
|
696
|
+
* domain: {
|
|
697
|
+
* name: 'Ether!',
|
|
698
|
+
* version: '1',
|
|
699
|
+
* chainId: 1,
|
|
700
|
+
* verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',
|
|
701
|
+
* },
|
|
702
|
+
* primaryType: 'Foo',
|
|
703
|
+
* types: {
|
|
704
|
+
* Foo: [
|
|
705
|
+
* { name: 'address', type: 'address' },
|
|
706
|
+
* { name: 'name', type: 'string' },
|
|
707
|
+
* { name: 'foo', type: 'string' },
|
|
708
|
+
* ],
|
|
709
|
+
* },
|
|
710
|
+
* message: {
|
|
711
|
+
* address: '0xb9CAB4F0E46F7F6b1024b5A7463734fa68E633f9',
|
|
712
|
+
* name: 'jxom',
|
|
713
|
+
* foo: '0xb9CAB4F0E46F7F6b1024b5A7463734fa68E633f9',
|
|
714
|
+
* },
|
|
715
|
+
* })
|
|
716
|
+
* // @log: true
|
|
717
|
+
* ```
|
|
718
|
+
*
|
|
719
|
+
* @param value - The Typed Data to validate.
|
|
720
|
+
*/
|
|
721
|
+
export function validate<
|
|
722
|
+
const typedData extends TypedData | Record<string, unknown>,
|
|
723
|
+
primaryType extends keyof typedData | 'EIP712Domain',
|
|
724
|
+
>(value: assert.Value<typedData, primaryType>): boolean {
|
|
725
|
+
try {
|
|
726
|
+
assert(value)
|
|
727
|
+
return true
|
|
728
|
+
} catch {
|
|
729
|
+
return false
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
export declare namespace validate {
|
|
734
|
+
type ErrorType = assert.ErrorType | Errors.GlobalErrorType
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
/* v8 ignore next */
|
|
738
|
+
validate.parseError = (error: unknown) => error as validate.ErrorType
|
|
739
|
+
|
|
740
|
+
/** Thrown when the bytes size of a typed data value does not match the expected size. */
|
|
741
|
+
export class BytesSizeMismatchError extends Errors.BaseError {
|
|
742
|
+
override readonly name = 'TypedData.BytesSizeMismatchError'
|
|
743
|
+
|
|
744
|
+
constructor({
|
|
745
|
+
expectedSize,
|
|
746
|
+
givenSize,
|
|
747
|
+
}: { expectedSize: number; givenSize: number }) {
|
|
748
|
+
super(`Expected bytes${expectedSize}, got bytes${givenSize}.`)
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
/** Thrown when the primary type of a typed data value is invalid. */
|
|
753
|
+
export class InvalidPrimaryTypeError extends Errors.BaseError {
|
|
754
|
+
override readonly name = 'TypedData.InvalidPrimaryTypeError'
|
|
755
|
+
|
|
756
|
+
constructor({
|
|
757
|
+
primaryType,
|
|
758
|
+
types,
|
|
759
|
+
}: { primaryType: string; types: TypedData | Record<string, unknown> }) {
|
|
760
|
+
super(
|
|
761
|
+
`Invalid primary type \`${primaryType}\` must be one of \`${JSON.stringify(Object.keys(types))}\`.`,
|
|
762
|
+
{
|
|
763
|
+
metaMessages: ['Check that the primary type is a key in `types`.'],
|
|
764
|
+
},
|
|
765
|
+
)
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
/** Thrown when the struct type is not a valid type. */
|
|
770
|
+
export class InvalidStructTypeError extends Errors.BaseError {
|
|
771
|
+
override readonly name = 'TypedData.InvalidStructTypeError'
|
|
772
|
+
|
|
773
|
+
constructor({ type }: { type: string }) {
|
|
774
|
+
super(`Struct type "${type}" is invalid.`, {
|
|
775
|
+
metaMessages: ['Struct type must not be a Solidity type.'],
|
|
776
|
+
})
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
/** @internal */
|
|
781
|
+
export function encodeData(value: {
|
|
782
|
+
data: Record<string, unknown>
|
|
783
|
+
primaryType: string
|
|
784
|
+
types: TypedData
|
|
785
|
+
}): Hex.Hex {
|
|
786
|
+
const { data, primaryType, types } = value
|
|
787
|
+
const encodedTypes: AbiParameters.Parameter[] = [{ type: 'bytes32' }]
|
|
788
|
+
const encodedValues: unknown[] = [hashType({ primaryType, types })]
|
|
789
|
+
|
|
790
|
+
for (const field of types[primaryType] ?? []) {
|
|
791
|
+
const [type, value] = encodeField({
|
|
792
|
+
types,
|
|
793
|
+
name: field.name,
|
|
794
|
+
type: field.type,
|
|
795
|
+
value: data[field.name],
|
|
796
|
+
})
|
|
797
|
+
encodedTypes.push(type)
|
|
798
|
+
encodedValues.push(value)
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
return AbiParameters.encode(encodedTypes, encodedValues)
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
/** @internal */
|
|
805
|
+
export declare namespace encodeData {
|
|
806
|
+
type ErrorType =
|
|
807
|
+
| AbiParameters.encode.ErrorType
|
|
808
|
+
| encodeField.ErrorType
|
|
809
|
+
| hashType.ErrorType
|
|
810
|
+
| Errors.GlobalErrorType
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
/** @internal */
|
|
814
|
+
export function hashType(value: {
|
|
815
|
+
primaryType: string
|
|
816
|
+
types: TypedData
|
|
817
|
+
}): Hex.Hex {
|
|
818
|
+
const { primaryType, types } = value
|
|
819
|
+
const encodedHashType = Hex.fromString(encodeType({ primaryType, types }))
|
|
820
|
+
return Hash.keccak256(encodedHashType)
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
/** @internal */
|
|
824
|
+
export declare namespace hashType {
|
|
825
|
+
type ErrorType =
|
|
826
|
+
| Hex.fromString.ErrorType
|
|
827
|
+
| encodeType.ErrorType
|
|
828
|
+
| Hash.keccak256.ErrorType
|
|
829
|
+
| Errors.GlobalErrorType
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
/** @internal */
|
|
833
|
+
export function encodeField(properties: {
|
|
834
|
+
types: TypedData
|
|
835
|
+
name: string
|
|
836
|
+
type: string
|
|
837
|
+
value: any
|
|
838
|
+
}): [type: AbiParameters.Parameter, value: Hex.Hex] {
|
|
839
|
+
let { types, name, type, value } = properties
|
|
840
|
+
|
|
841
|
+
if (types[type] !== undefined)
|
|
842
|
+
return [
|
|
843
|
+
{ type: 'bytes32' },
|
|
844
|
+
Hash.keccak256(encodeData({ data: value, primaryType: type, types })),
|
|
845
|
+
]
|
|
846
|
+
|
|
847
|
+
if (type === 'bytes') {
|
|
848
|
+
const prepend = value.length % 2 ? '0' : ''
|
|
849
|
+
value = `0x${prepend + value.slice(2)}`
|
|
850
|
+
return [{ type: 'bytes32' }, Hash.keccak256(value, { as: 'Hex' })]
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
if (type === 'string')
|
|
854
|
+
return [
|
|
855
|
+
{ type: 'bytes32' },
|
|
856
|
+
Hash.keccak256(Bytes.fromString(value), { as: 'Hex' }),
|
|
857
|
+
]
|
|
858
|
+
|
|
859
|
+
if (type.lastIndexOf(']') === type.length - 1) {
|
|
860
|
+
const parsedType = type.slice(0, type.lastIndexOf('['))
|
|
861
|
+
const typeValuePairs = (value as [AbiParameters.Parameter, any][]).map(
|
|
862
|
+
(item) =>
|
|
863
|
+
encodeField({
|
|
864
|
+
name,
|
|
865
|
+
type: parsedType,
|
|
866
|
+
types,
|
|
867
|
+
value: item,
|
|
868
|
+
}),
|
|
869
|
+
)
|
|
870
|
+
return [
|
|
871
|
+
{ type: 'bytes32' },
|
|
872
|
+
Hash.keccak256(
|
|
873
|
+
AbiParameters.encode(
|
|
874
|
+
typeValuePairs.map(([t]) => t),
|
|
875
|
+
typeValuePairs.map(([, v]) => v),
|
|
876
|
+
),
|
|
877
|
+
),
|
|
878
|
+
]
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
return [{ type }, value]
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
/** @internal */
|
|
885
|
+
export declare namespace encodeField {
|
|
886
|
+
type ErrorType =
|
|
887
|
+
| AbiParameters.encode.ErrorType
|
|
888
|
+
| Hash.keccak256.ErrorType
|
|
889
|
+
| Bytes.fromString.ErrorType
|
|
890
|
+
| Errors.GlobalErrorType
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
/** @internal */
|
|
894
|
+
export function findTypeDependencies(
|
|
895
|
+
value: {
|
|
896
|
+
primaryType: string
|
|
897
|
+
types: TypedData
|
|
898
|
+
},
|
|
899
|
+
results: Set<string> = new Set(),
|
|
900
|
+
): Set<string> {
|
|
901
|
+
const { primaryType: primaryType_, types } = value
|
|
902
|
+
const match = primaryType_.match(/^\w*/u)
|
|
903
|
+
const primaryType = match?.[0]!
|
|
904
|
+
if (results.has(primaryType) || types[primaryType] === undefined)
|
|
905
|
+
return results
|
|
906
|
+
|
|
907
|
+
results.add(primaryType)
|
|
908
|
+
|
|
909
|
+
for (const field of types[primaryType])
|
|
910
|
+
findTypeDependencies({ primaryType: field.type, types }, results)
|
|
911
|
+
return results
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
/** @internal */
|
|
915
|
+
export declare namespace findTypeDependencies {
|
|
916
|
+
type ErrorType = Errors.GlobalErrorType
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
/** @internal */
|
|
920
|
+
function validateReference(type: string) {
|
|
921
|
+
// Struct type must not be a Solidity type.
|
|
922
|
+
if (
|
|
923
|
+
type === 'address' ||
|
|
924
|
+
type === 'bool' ||
|
|
925
|
+
type === 'string' ||
|
|
926
|
+
type.startsWith('bytes') ||
|
|
927
|
+
type.startsWith('uint') ||
|
|
928
|
+
type.startsWith('int')
|
|
929
|
+
)
|
|
930
|
+
throw new InvalidStructTypeError({ type })
|
|
931
|
+
}
|