@skalenetwork/privacy-sdk 0.1.0-develop.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/README.md +56 -0
- package/dist/actions/index.cjs +2982 -0
- package/dist/actions/index.cjs.map +1 -0
- package/dist/actions/index.d.cts +26 -0
- package/dist/actions/index.d.ts +26 -0
- package/dist/actions/index.js +38 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/chunk-K5WS3F4Q.js +134 -0
- package/dist/chunk-K5WS3F4Q.js.map +1 -0
- package/dist/chunk-Y6NM73JA.js +99 -0
- package/dist/chunk-Y6NM73JA.js.map +1 -0
- package/dist/chunk-YEII26VS.js +2853 -0
- package/dist/chunk-YEII26VS.js.map +1 -0
- package/dist/ctx-ifn_jhPL.d.cts +16 -0
- package/dist/ctx-ifn_jhPL.d.ts +16 -0
- package/dist/index.cjs +3137 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2066 -0
- package/dist/index.d.ts +2066 -0
- package/dist/index.js +171 -0
- package/dist/index.js.map +1 -0
- package/dist/types-CBDYydn0.d.cts +60 -0
- package/dist/types-Gn0F4pQf.d.ts +60 -0
- package/dist/types-WaeCtQlG.d.cts +32 -0
- package/dist/types-WaeCtQlG.d.ts +32 -0
- package/dist/utils/index.cjs +256 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +17 -0
- package/dist/utils/index.d.ts +17 -0
- package/dist/utils/index.js +27 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/actions/index.ts","../../src/actions/transfers.ts","../../src/abi/confidentialWrapper.ts","../../src/actions/funding.ts","../../src/actions/decrypt.ts","../../src/utils/crypto.ts","../../src/actions/access.ts","../../src/utils/viewerKey.ts"],"sourcesContent":["// Actions - standalone, tree-shakable functions\nexport { approve, transfer, wrap, unwrap } from \"./transfers.js\";\n\nexport { getCtxBalance, getCtxFee, fundCtxBalance, getValueForCtx } from \"./funding.js\";\n\nexport { decryptTokenBalance, decryptHistoricTransferData, getTransferId } from \"./decrypt.js\";\n\nexport {\n registerViewerKey,\n authorizeHistoricViewForRange,\n authorizeHistoricViewForTransfer,\n revokeHistoricView,\n requestTransferDecryption,\n} from \"./access.js\";\n\n// Types\nexport type {\n ActionConfig,\n TransferParams,\n WrapParams,\n UnwrapParams,\n ApproveParams,\n TopUpParams,\n RegisterViewerKeyParams,\n AuthorizeHistoricViewForRangeParams,\n AuthorizeHistoricViewForTransferParams,\n RevokeHistoricViewParams,\n GetTransferIdParams,\n RequestTransferDecryptionParams,\n DecryptHistoricTransferDataParams,\n DecryptBalanceParams,\n} from \"./types.js\";\n","import { encodeFunctionData, toHex, type Hex } from \"viem\";\nimport { confidentialWrapperAbi } from \"../abi/confidentialWrapper.js\";\nimport { getValueForCtx } from \"./funding.js\";\nimport type {\n ActionConfig,\n ApproveParams,\n TransferParams,\n WrapParams,\n UnwrapParams,\n} from \"./types.js\";\n\nexport async function approve(config: ActionConfig, params: ApproveParams): Promise<Hex> {\n const data = encodeFunctionData({\n abi: confidentialWrapperAbi,\n functionName: \"approve\",\n args: [params.spender, params.amount],\n });\n return config.signer.sendTransaction({ to: config.address, data });\n}\n\nexport async function transfer(config: ActionConfig, params: TransferParams): Promise<Hex> {\n const value = await getValueForCtx(config);\n\n const valueHex = toHex(params.amount, { size: 32 });\n const encryptedValue = await config.bite.encryptMessageForCTX(valueHex, config.address);\n\n const data = encodeFunctionData({\n abi: confidentialWrapperAbi,\n functionName: \"encryptedTransfer\",\n args: [params.to, encryptedValue as Hex],\n });\n return config.signer.sendTransaction({ to: config.address, data, value });\n}\n\nexport async function wrap(config: ActionConfig, params: WrapParams): Promise<Hex> {\n const value = await getValueForCtx(config);\n\n const data = encodeFunctionData({\n abi: confidentialWrapperAbi,\n functionName: \"depositForWithGasToken\",\n args: [params.receiver, params.amount],\n });\n return config.signer.sendTransaction({ to: config.address, data, value });\n}\n\nexport async function unwrap(config: ActionConfig, params: UnwrapParams): Promise<Hex> {\n const value = await getValueForCtx(config);\n\n const data = encodeFunctionData({\n abi: confidentialWrapperAbi,\n functionName: \"withdrawToWithGasToken\",\n args: [params.receiver, params.amount],\n });\n return config.signer.sendTransaction({ to: config.address, data, value });\n}\n","export const confidentialWrapperAbi = [\n {\n inputs: [\n {\n internalType: \"contract IERC20Metadata\",\n name: \"underlyingToken\",\n type: \"address\",\n },\n {\n internalType: \"string\",\n name: \"version_\",\n type: \"string\",\n },\n {\n internalType: \"address\",\n name: \"initialAuthority\",\n type: \"address\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"authority\",\n type: \"address\",\n },\n ],\n name: \"AccessManagedInvalidAuthority\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"caller\",\n type: \"address\",\n },\n {\n internalType: \"uint32\",\n name: \"delay\",\n type: \"uint32\",\n },\n ],\n name: \"AccessManagedRequiredDelay\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"caller\",\n type: \"address\",\n },\n ],\n name: \"AccessManagedUnauthorized\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"AccessViolation\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"ActionNotRecognized\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"validBefore\",\n type: \"uint256\",\n },\n ],\n name: \"AuthorizationIsExpired\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"validAfter\",\n type: \"uint256\",\n },\n ],\n name: \"AuthorizationIsNotYetValid\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"authorizer\",\n type: \"address\",\n },\n {\n internalType: \"bytes32\",\n name: \"nonce\",\n type: \"bytes32\",\n },\n ],\n name: \"AuthorizationUsedError\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"CTXAbiToRlpConversionFailed\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"CTXAbiToRlpUnknownError\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"CTXCountNotVerifyTransaction\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"CTXDataOffsetOutOfBounds\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"CTXDataTooShort\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"CTXInputTooShort\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"CTXInvalidDestination\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"CTXInvalidGasLimit\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"CTXInvalidSignature\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"CTXInvalidTransaction\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"CTXUnknownError\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"caller\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"payee\",\n type: \"address\",\n },\n ],\n name: \"CallerMustBeThePayee\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"DataLengthMismatch\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"DecryptionBadFormat\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"ECDSAInvalidSignature\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"length\",\n type: \"uint256\",\n },\n ],\n name: \"ECDSAInvalidSignatureLength\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"bytes32\",\n name: \"s\",\n type: \"bytes32\",\n },\n ],\n name: \"ECDSAInvalidSignatureS\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"ECIESEncryptionFailed\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"ECIESInvalidPublicKey\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"allowance\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"needed\",\n type: \"uint256\",\n },\n ],\n name: \"ERC20InsufficientAllowance\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"balance\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"needed\",\n type: \"uint256\",\n },\n ],\n name: \"ERC20InsufficientBalance\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"approver\",\n type: \"address\",\n },\n ],\n name: \"ERC20InvalidApprover\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"receiver\",\n type: \"address\",\n },\n ],\n name: \"ERC20InvalidReceiver\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n ],\n name: \"ERC20InvalidSender\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n ],\n name: \"ERC20InvalidSpender\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"token\",\n type: \"address\",\n },\n ],\n name: \"ERC20InvalidUnderlying\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"deadline\",\n type: \"uint256\",\n },\n ],\n name: \"ERC2612ExpiredSignature\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"signer\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n ],\n name: \"ERC2612InvalidSigner\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"precompiledContract\",\n type: \"address\",\n },\n ],\n name: \"EmptyReturnData\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"FailedCall\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"precompiledContract\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"expected\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"actual\",\n type: \"uint256\",\n },\n ],\n name: \"IncorrectReturnDataLength\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"InputNot32ByteAligned\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"InputTooLarge\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"InputTooShort\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"balance\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"needed\",\n type: \"uint256\",\n },\n ],\n name: \"InsufficientBalance\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"InsufficientBalance\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"required\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"available\",\n type: \"uint256\",\n },\n ],\n name: \"InsufficientGasToken\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"currentNonce\",\n type: \"uint256\",\n },\n ],\n name: \"InvalidAccountNonce\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"InvalidDataOffset\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"InvalidPublicKey\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"precompiledContract\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"expectedMin\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"actual\",\n type: \"uint256\",\n },\n ],\n name: \"InvalidReturnDataSize\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"InvalidShortString\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"InvalidSignature\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"fromTimestamp\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"toTimestamp\",\n type: \"uint256\",\n },\n ],\n name: \"InvalidTimeRange\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"transferId\",\n type: \"uint256\",\n },\n ],\n name: \"InvalidTransferId\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n ],\n name: \"NoViewerRegisteredForHolder\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"OutdatedMint\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"viewer\",\n type: \"address\",\n },\n ],\n name: \"PublicKeyIsNotRegistered\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"token\",\n type: \"address\",\n },\n ],\n name: \"SafeERC20FailedOperation\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"string\",\n name: \"str\",\n type: \"string\",\n },\n ],\n name: \"StringTooLong\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"TrailingPaddingNotZeros\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"errorCode\",\n type: \"uint256\",\n },\n ],\n name: \"UnknownEncryptionError\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"bytes\",\n name: \"errorData\",\n type: \"bytes\",\n },\n ],\n name: \"UnknownError\",\n type: \"error\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"viewer\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"transferId\",\n type: \"uint256\",\n },\n ],\n name: \"UserIsNotAuthorizedToDecryptTransfer\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"ValueIsEncrypted\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"ValueWasNotEncryptedCorrectly\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"WrongPlaintextFormat\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"ZeroAddress\",\n type: \"error\",\n },\n {\n inputs: [],\n name: \"ZeroValue\",\n type: \"error\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Approval\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"authority\",\n type: \"address\",\n },\n ],\n name: \"AuthorityUpdated\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"authorizer\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"bytes32\",\n name: \"nonce\",\n type: \"bytes32\",\n },\n ],\n name: \"AuthorizationCanceled\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"authorizer\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"bytes32\",\n name: \"nonce\",\n type: \"bytes32\",\n },\n ],\n name: \"AuthorizationUsed\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"callbackSender\",\n type: \"address\",\n },\n ],\n name: \"CTXResubmitted\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"callbackSender\",\n type: \"address\",\n },\n ],\n name: \"CTXSubmitted\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"newFee\",\n type: \"uint256\",\n },\n ],\n name: \"CallbackFeeChanged\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [],\n name: \"EIP712DomainChanged\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"newAddress\",\n type: \"address\",\n },\n ],\n name: \"EncryptECIESAddressChanged\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"newAddress\",\n type: \"address\",\n },\n ],\n name: \"EncryptTEAddressChanged\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"transferId\",\n type: \"uint256\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"bytes\",\n name: \"encryptedData\",\n type: \"bytes\",\n },\n ],\n name: \"EncryptedTransfer\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"receiver\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"GasTokenBalanceToppedUp\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"receiver\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"GasTokenWithdrawn\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"viewer\",\n type: \"address\",\n },\n ],\n name: \"HistoricViewPermissionsRevoked\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"viewer\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"fromTimestamp\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"toTimestamp\",\n type: \"uint256\",\n },\n ],\n name: \"HistoricViewTimeRangeAuthorized\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"viewer\",\n type: \"address\",\n },\n ],\n name: \"HistoricViewTimeRangeRevoked\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"viewer\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"transferId\",\n type: \"uint256\",\n },\n ],\n name: \"HistoricViewTransferIdAuthorized\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"viewer\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"transferId\",\n type: \"uint256\",\n },\n ],\n name: \"HistoricViewTransferIdRevoked\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"viewer\",\n type: \"address\",\n },\n ],\n name: \"PublicKeyRegistered\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"viewer\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"bytes\",\n name: \"encryptedTransfer\",\n type: \"bytes\",\n },\n ],\n name: \"ReEncryptedTransfer\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"newAddress\",\n type: \"address\",\n },\n ],\n name: \"SubmitCTXAddressChanged\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"transferId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"bytes\",\n name: \"encryptedValue\",\n type: \"bytes\",\n },\n ],\n name: \"TransferValueEncryptedForRecipient\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"uint256\",\n name: \"transferId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"bytes\",\n name: \"encryptedValue\",\n type: \"bytes\",\n },\n ],\n name: \"TransferValueEncryptedForSender\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newViewer\",\n type: \"address\",\n },\n ],\n name: \"ViewerChanged\",\n type: \"event\",\n },\n {\n inputs: [],\n name: \"CANCEL_AUTHORIZATION_TYPEHASH\",\n outputs: [\n {\n internalType: \"bytes32\",\n name: \"\",\n type: \"bytes32\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"DOMAIN_SEPARATOR\",\n outputs: [\n {\n internalType: \"bytes32\",\n name: \"\",\n type: \"bytes32\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"ENCRYPTED_RECEIVE_WITH_AUTHORIZATION_TYPEHASH\",\n outputs: [\n {\n internalType: \"bytes32\",\n name: \"\",\n type: \"bytes32\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"ENCRYPTED_TRANSFER_WITH_AUTHORIZATION_TYPEHASH\",\n outputs: [\n {\n internalType: \"bytes32\",\n name: \"\",\n type: \"bytes32\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"RECEIVE_WITH_AUTHORIZATION_TYPEHASH\",\n outputs: [\n {\n internalType: \"bytes32\",\n name: \"\",\n type: \"bytes32\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"TRANSFER_WITH_AUTHORIZATION_TYPEHASH\",\n outputs: [\n {\n internalType: \"bytes32\",\n name: \"\",\n type: \"bytes32\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n ],\n name: \"allowance\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"approve\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"authority\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"authorizer\",\n type: \"address\",\n },\n {\n internalType: \"bytes32\",\n name: \"nonce\",\n type: \"bytes32\",\n },\n ],\n name: \"authorizationState\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"used\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"viewer\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"fromTimestamp\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"toTimestamp\",\n type: \"uint256\",\n },\n ],\n name: \"authorizeHistoricViewTimeRange\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"success\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"viewer\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"transferId\",\n type: \"uint256\",\n },\n ],\n name: \"authorizeHistoricViewTransferId\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"success\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n ],\n name: \"balanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"balance\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"callbackFee\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"viewer\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"transferId\",\n type: \"uint256\",\n },\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"timestamp\",\n type: \"uint256\",\n },\n ],\n name: \"canDecryptHistoricTransfer\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"canDecrypt\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"authorizer\",\n type: \"address\",\n },\n {\n internalType: \"bytes32\",\n name: \"nonce\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint8\",\n name: \"v\",\n type: \"uint8\",\n },\n {\n internalType: \"bytes32\",\n name: \"r\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes32\",\n name: \"s\",\n type: \"bytes32\",\n },\n ],\n name: \"cancelAuthorization\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"decimals\",\n outputs: [\n {\n internalType: \"uint8\",\n name: \"decimalsValue\",\n type: \"uint8\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"depositFor\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"success\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"depositForWithGasToken\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"success\",\n type: \"bool\",\n },\n ],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"eip712Domain\",\n outputs: [\n {\n internalType: \"bytes1\",\n name: \"fields\",\n type: \"bytes1\",\n },\n {\n internalType: \"string\",\n name: \"name\",\n type: \"string\",\n },\n {\n internalType: \"string\",\n name: \"version\",\n type: \"string\",\n },\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"address\",\n name: \"verifyingContract\",\n type: \"address\",\n },\n {\n internalType: \"bytes32\",\n name: \"salt\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256[]\",\n name: \"extensions\",\n type: \"uint256[]\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"encryptECIESAddress\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"encryptTEAddress\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n ],\n name: \"encryptedBalanceOf\",\n outputs: [\n {\n internalType: \"bytes\",\n name: \"encryptedBalance\",\n type: \"bytes\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"bytes\",\n name: \"value\",\n type: \"bytes\",\n },\n {\n internalType: \"uint256\",\n name: \"validAfter\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"validBefore\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"nonce\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint8\",\n name: \"v\",\n type: \"uint8\",\n },\n {\n internalType: \"bytes32\",\n name: \"r\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes32\",\n name: \"s\",\n type: \"bytes32\",\n },\n ],\n name: \"encryptedReceiveWithAuthorization\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"bytes\",\n name: \"value\",\n type: \"bytes\",\n },\n ],\n name: \"encryptedTransfer\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"bytes\",\n name: \"value\",\n type: \"bytes\",\n },\n ],\n name: \"encryptedTransferFrom\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"bytes\",\n name: \"value\",\n type: \"bytes\",\n },\n {\n internalType: \"uint256\",\n name: \"validAfter\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"validBefore\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"nonce\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint8\",\n name: \"v\",\n type: \"uint8\",\n },\n {\n internalType: \"bytes32\",\n name: \"r\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes32\",\n name: \"s\",\n type: \"bytes32\",\n },\n ],\n name: \"encryptedTransferWithAuthorization\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"receiver\",\n type: \"address\",\n },\n ],\n name: \"fundWithGasToken\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n ],\n name: \"gasTokenBalanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"balance\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"isConsumingScheduledOp\",\n outputs: [\n {\n internalType: \"bytes4\",\n name: \"\",\n type: \"bytes4\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"name\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n ],\n name: \"nonces\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes[]\",\n name: \"decryptedArguments\",\n type: \"bytes[]\",\n },\n {\n internalType: \"bytes[]\",\n name: \"plaintextArguments\",\n type: \"bytes[]\",\n },\n ],\n name: \"onDecrypt\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"deadline\",\n type: \"uint256\",\n },\n {\n internalType: \"uint8\",\n name: \"v\",\n type: \"uint8\",\n },\n {\n internalType: \"bytes32\",\n name: \"r\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes32\",\n name: \"s\",\n type: \"bytes32\",\n },\n ],\n name: \"permit\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"accountAddress\",\n type: \"address\",\n },\n ],\n name: \"publicKeys\",\n outputs: [\n {\n internalType: \"bytes32\",\n name: \"x\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes32\",\n name: \"y\",\n type: \"bytes32\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"validAfter\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"validBefore\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"nonce\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint8\",\n name: \"v\",\n type: \"uint8\",\n },\n {\n internalType: \"bytes32\",\n name: \"r\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes32\",\n name: \"s\",\n type: \"bytes32\",\n },\n ],\n name: \"receiveWithAuthorization\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n {\n internalType: \"bytes32\",\n name: \"x\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes32\",\n name: \"y\",\n type: \"bytes32\",\n },\n ],\n internalType: \"struct PublicKey\",\n name: \"publicKey\",\n type: \"tuple\",\n },\n ],\n name: \"registerPublicKey\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"releaseTo\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"viewer\",\n type: \"address\",\n },\n ],\n name: \"removeHistoricViewAuth\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"success\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"viewer\",\n type: \"address\",\n },\n ],\n name: \"removeHistoricViewTimeRange\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"success\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"viewer\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"transferId\",\n type: \"uint256\",\n },\n ],\n name: \"removeHistoricViewTransferId\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"success\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes\",\n name: \"encryptedTransferData\",\n type: \"bytes\",\n },\n ],\n name: \"requestDecryptHistoricTransfer\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes\",\n name: \"encryptedTransferData\",\n type: \"bytes\",\n },\n {\n internalType: \"address\",\n name: \"historicViewer\",\n type: \"address\",\n },\n ],\n name: \"requestDecryptHistoricTransferFor\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n ],\n name: \"requestedMints\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n {\n internalType: \"address\",\n name: \"receiver\",\n type: \"address\",\n },\n ],\n name: \"retrieveGasToken\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newAuthority\",\n type: \"address\",\n },\n ],\n name: \"setAuthority\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"newFee\",\n type: \"uint256\",\n },\n ],\n name: \"setCallbackFee\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newAddress\",\n type: \"address\",\n },\n ],\n name: \"setEncryptECIESAddress\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newAddress\",\n type: \"address\",\n },\n ],\n name: \"setEncryptTEAddress\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newAddress\",\n type: \"address\",\n },\n ],\n name: \"setSubmitCTXAddress\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"viewer\",\n type: \"address\",\n },\n ],\n name: \"setViewerAddress\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n {\n internalType: \"bytes32\",\n name: \"x\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes32\",\n name: \"y\",\n type: \"bytes32\",\n },\n ],\n internalType: \"struct PublicKey\",\n name: \"publicKey\",\n type: \"tuple\",\n },\n ],\n name: \"setViewerPublicKey\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"submitCTXAddress\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"symbol\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"totalSupply\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"supply\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"transfer\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"transferFrom\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"result\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"validAfter\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"validBefore\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"nonce\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint8\",\n name: \"v\",\n type: \"uint8\",\n },\n {\n internalType: \"bytes32\",\n name: \"r\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes32\",\n name: \"s\",\n type: \"bytes32\",\n },\n ],\n name: \"transferWithAuthorization\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"underlying\",\n outputs: [\n {\n internalType: \"contract IERC20\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"version\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"holder\",\n type: \"address\",\n },\n ],\n name: \"viewerAddresses\",\n outputs: [\n {\n internalType: \"address\",\n name: \"viewerAddress\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"withdrawTo\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"success\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"withdrawToWithGasToken\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"success\",\n type: \"bool\",\n },\n ],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n stateMutability: \"payable\",\n type: \"receive\",\n },\n] as const;\n","import { encodeFunctionData, type Hex } from \"viem\";\nimport { confidentialWrapperAbi } from \"../abi/confidentialWrapper.js\";\nimport type { ActionConfig, TopUpParams } from \"./types.js\";\n\nconst CTX_RESERVE_THRESHOLD = 1n;\n\nexport async function getCtxBalance(config: ActionConfig): Promise<bigint> {\n return (await config.publicClient.readContract({\n address: config.address,\n abi: confidentialWrapperAbi,\n functionName: \"gasTokenBalanceOf\",\n args: [config.signer.address],\n })) as bigint;\n}\n\nexport async function getCtxFee(config: ActionConfig): Promise<bigint> {\n return (await config.publicClient.readContract({\n address: config.address,\n abi: confidentialWrapperAbi,\n functionName: \"callbackFee\",\n })) as bigint;\n}\n\nexport async function fundCtxBalance(config: ActionConfig, params: TopUpParams): Promise<Hex> {\n const data = encodeFunctionData({\n abi: confidentialWrapperAbi,\n functionName: \"fundWithGasToken\",\n args: [config.signer.address],\n });\n return config.signer.sendTransaction({\n to: config.address,\n data,\n value: params.amount,\n });\n}\n\nexport async function getValueForCtx(config: ActionConfig): Promise<bigint> {\n const [fee, balance] = await Promise.all([getCtxFee(config), getCtxBalance(config)]);\n const topUp = CTX_RESERVE_THRESHOLD * fee - balance;\n return fee + (topUp > 0n ? topUp : 0n);\n}\n","import { bytesToHex, parseEventLogs, type Hex } from \"viem\";\nimport { confidentialWrapperAbi } from \"../abi/confidentialWrapper.js\";\nimport { decryptBalance, decryptTransferData } from \"../utils/crypto.js\";\nimport type {\n ActionConfig,\n DecryptBalanceParams,\n DecryptHistoricTransferDataParams,\n GetTransferIdParams,\n} from \"./types.js\";\nimport type { TransferData } from \"../types.js\";\n\nexport async function decryptTokenBalance(\n config: ActionConfig,\n params: DecryptBalanceParams,\n): Promise<bigint> {\n const raw = await config.publicClient.readContract({\n address: config.address,\n abi: confidentialWrapperAbi,\n functionName: \"encryptedBalanceOf\",\n args: [config.signer.address],\n });\n\n const encryptedHex = (typeof raw === \"string\" ? raw : bytesToHex(raw as Uint8Array)) as Hex;\n\n return decryptBalance(encryptedHex, params.viewerKey);\n}\n\nexport async function decryptHistoricTransferData(\n params: DecryptHistoricTransferDataParams,\n): Promise<TransferData> {\n return decryptTransferData(params.encryptedData, params.viewerKey);\n}\n\nexport async function getTransferId(\n config: ActionConfig,\n params: GetTransferIdParams,\n): Promise<bigint> {\n const receipt = await config.publicClient.waitForTransactionReceipt({ hash: params.ctxHash });\n const events = parseEventLogs({\n abi: confidentialWrapperAbi,\n logs: receipt.logs,\n eventName: \"EncryptedTransfer\",\n });\n\n const event = events[0];\n if (!event) {\n throw new Error(\"CTX receipt does not contain an EncryptedTransfer event.\");\n }\n\n const transferId = (event.args as { transferId?: bigint }).transferId;\n if (transferId === undefined) {\n throw new Error(\"CTX receipt does not contain an EncryptedTransfer event.\");\n }\n\n return transferId;\n}\n","import { secp256k1 } from \"@noble/curves/secp256k1\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { cbc } from \"@noble/ciphers/aes\";\nimport { bytesToHex, decodeAbiParameters, hexToBytes, type Hex } from \"viem\";\n\nimport type { TransferData } from \"../types.js\";\n\nfunction bytesToBigInt(bytes: Uint8Array): bigint {\n if (bytes.length === 0) {\n return 0n;\n }\n const hexValue = bytesToHex(bytes);\n return BigInt(hexValue === \"0x\" ? \"0x0\" : hexValue);\n}\n\nexport function decryptEciesPayload(encryptedHex: Hex, privateKey: Hex): Uint8Array {\n const payload = hexToBytes(encryptedHex);\n\n if (payload.length < 65) {\n throw new Error(\"Encrypted payload is too short.\");\n }\n\n const iv = payload.slice(0, 16);\n const ephemeralCompressedPublicKey = payload.slice(16, 49);\n const ciphertext = payload.slice(49);\n\n if (ephemeralCompressedPublicKey.length !== 33) {\n throw new Error(\"Invalid ephemeral public key length in encrypted payload.\");\n }\n\n if (ciphertext.length === 0 || ciphertext.length % 16 !== 0) {\n throw new Error(\"Invalid AES-CBC ciphertext length.\");\n }\n\n const sharedSecret = secp256k1.getSharedSecret(\n hexToBytes(privateKey),\n ephemeralCompressedPublicKey,\n true,\n );\n const encryptionKey = sha256(sharedSecret.slice(1));\n const keyMaterial = Uint8Array.from(encryptionKey);\n\n return cbc(keyMaterial, iv).decrypt(ciphertext);\n}\n\nfunction tryDecodeTransferData(encoded: Hex): TransferData | undefined {\n try {\n const [from, to, value, timestamp, transferId] = decodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"address\" },\n { type: \"uint256\" },\n { type: \"uint256\" },\n { type: \"uint256\" },\n ],\n encoded,\n );\n\n return { from, to, value, timestamp, transferId };\n } catch {\n return undefined;\n }\n}\n\nexport async function decryptBalance(encryptedHex: Hex, privateKey: Hex): Promise<bigint> {\n const plaintext = decryptEciesPayload(encryptedHex, privateKey);\n\n if (plaintext.length <= 32) {\n return bytesToBigInt(plaintext);\n }\n\n return bytesToBigInt(plaintext.slice(-32));\n}\n\nexport async function decryptTransferData(\n encryptedHex: Hex,\n privateKey: Hex,\n): Promise<TransferData> {\n const plaintext = decryptEciesPayload(encryptedHex, privateKey);\n\n const direct = tryDecodeTransferData(bytesToHex(plaintext));\n if (direct) {\n return direct;\n }\n\n const structSizeBytes = 32 * 5;\n if (plaintext.length >= structSizeBytes) {\n const trailing = plaintext.slice(-structSizeBytes);\n const trailingDecoded = tryDecodeTransferData(bytesToHex(trailing));\n if (trailingDecoded) {\n return trailingDecoded;\n }\n }\n\n throw new Error(\"Unable to decode decrypted transfer payload as TransferData struct.\");\n}\n","import { encodeFunctionData, parseEventLogs, type Hex } from \"viem\";\nimport { confidentialWrapperAbi } from \"../abi/confidentialWrapper.js\";\nimport { parsePublicKeyCoordinates } from \"../utils/viewerKey.js\";\nimport { getValueForCtx } from \"./funding.js\";\nimport type {\n ActionConfig,\n RegisterViewerKeyParams,\n AuthorizeHistoricViewForRangeParams,\n AuthorizeHistoricViewForTransferParams,\n RevokeHistoricViewParams,\n RequestTransferDecryptionParams,\n} from \"./types.js\";\n\nexport async function registerViewerKey(\n config: ActionConfig,\n params: RegisterViewerKeyParams,\n): Promise<Hex> {\n const { x, y } = parsePublicKeyCoordinates(params.publicKey);\n const data = encodeFunctionData({\n abi: confidentialWrapperAbi,\n functionName: \"setViewerPublicKey\",\n args: [{ x, y }],\n });\n return config.signer.sendTransaction({ to: config.address, data });\n}\n\nexport async function authorizeHistoricViewForRange(\n config: ActionConfig,\n params: AuthorizeHistoricViewForRangeParams,\n): Promise<Hex> {\n const data = encodeFunctionData({\n abi: confidentialWrapperAbi,\n functionName: \"authorizeHistoricViewTimeRange\",\n args: [params.address, params.fromTimestamp, params.toTimestamp],\n });\n return config.signer.sendTransaction({ to: config.address, data });\n}\n\nexport async function authorizeHistoricViewForTransfer(\n config: ActionConfig,\n params: AuthorizeHistoricViewForTransferParams,\n): Promise<Hex> {\n const data = encodeFunctionData({\n abi: confidentialWrapperAbi,\n functionName: \"authorizeHistoricViewTransferId\",\n args: [params.address, params.transferId],\n });\n return config.signer.sendTransaction({ to: config.address, data });\n}\n\nexport async function revokeHistoricView(\n config: ActionConfig,\n params: RevokeHistoricViewParams,\n): Promise<Hex> {\n const data = encodeFunctionData({\n abi: confidentialWrapperAbi,\n functionName: \"removeHistoricViewAuth\",\n args: [params.address],\n });\n return config.signer.sendTransaction({ to: config.address, data });\n}\n\nexport async function requestTransferDecryption(\n config: ActionConfig,\n params: RequestTransferDecryptionParams,\n): Promise<Hex> {\n const value = await getValueForCtx(config);\n\n // 1. Get encryptedData from the EncryptedTransfer event\n const receipt = await config.publicClient.waitForTransactionReceipt({ hash: params.ctxHash });\n const events = parseEventLogs({\n abi: confidentialWrapperAbi,\n logs: receipt.logs,\n eventName: \"EncryptedTransfer\",\n });\n\n const event = events[0];\n if (!event) {\n throw new Error(\"CTX receipt does not contain an EncryptedTransfer event.\");\n }\n\n const args = event.args as { encryptedData?: Hex; transferId?: bigint; from?: Hex; to?: Hex };\n const { encryptedData, transferId, from, to } = args;\n\n if (!encryptedData || transferId === undefined || !from || !to) {\n throw new Error(\"CTX receipt does not contain an EncryptedTransfer event.\");\n }\n\n // 2. Check permissions\n const viewerAddress = (await config.publicClient.readContract({\n address: config.address,\n abi: confidentialWrapperAbi,\n functionName: \"viewerAddresses\",\n args: [config.signer.address],\n })) as Hex;\n\n const block = await config.publicClient.getBlock({ blockNumber: receipt.blockNumber });\n const canDecrypt = (await config.publicClient.readContract({\n address: config.address,\n abi: confidentialWrapperAbi,\n functionName: \"canDecryptHistoricTransfer\",\n args: [viewerAddress, transferId, from, to, block.timestamp],\n })) as boolean;\n\n if (!canDecrypt) {\n throw new Error(\"Viewer is not authorized to decrypt this historic transfer.\");\n }\n\n // 3. Request re-encryption\n const data = encodeFunctionData({\n abi: confidentialWrapperAbi,\n functionName: \"requestDecryptHistoricTransferFor\",\n args: [encryptedData, viewerAddress],\n });\n return config.signer.sendTransaction({ to: config.address, data, value });\n}\n","import { type Hex, hexToBytes, isAddressEqual, keccak256, toHex, zeroAddress } from \"viem\";\nimport { publicKeyToAddress } from \"viem/utils\";\nimport { secp256k1 } from \"@noble/curves/secp256k1\";\n\nimport type { ViewerKeypair } from \"../types.js\";\n\nfunction privateKeyFromSignature(signature: Hex): Hex {\n let candidate = keccak256(hexToBytes(signature));\n\n for (let i = 0; i < 16; i += 1) {\n if (secp256k1.utils.isValidSecretKey(hexToBytes(candidate))) {\n return candidate;\n }\n candidate = keccak256(hexToBytes(candidate));\n }\n\n throw new Error(\"Unable to derive a valid deterministic private key from signature.\");\n}\n\nexport function parsePublicKeyCoordinates(publicKey: Hex): { x: Hex; y: Hex } {\n const raw = publicKey.startsWith(\"0x04\") ? publicKey.slice(4) : publicKey.slice(2);\n\n if (raw.length !== 128) {\n throw new Error(\"Public key must be an uncompressed key (65 bytes with 0x04 prefix).\");\n }\n\n return {\n x: `0x${raw.slice(0, 64)}` as Hex,\n y: `0x${raw.slice(64, 128)}` as Hex,\n };\n}\n\nexport function deriveAddressFromPublicKey(publicKey: Hex): Hex {\n const key = publicKey.startsWith(\"0x04\") ? publicKey : (`0x04${publicKey.slice(2)}` as Hex);\n return publicKeyToAddress(key) as Hex;\n}\n\nexport function validateViewerKey(publicKey: Hex, expectedViewerAddress?: Hex): string | undefined {\n if (!expectedViewerAddress) {\n return undefined;\n }\n\n if (isAddressEqual(expectedViewerAddress, zeroAddress)) {\n return undefined;\n }\n\n const derivedViewerAddress = deriveAddressFromPublicKey(publicKey);\n if (!isAddressEqual(derivedViewerAddress, expectedViewerAddress)) {\n return \"Public key does not match the registered viewer address.\";\n }\n\n return undefined;\n}\n\nexport function deriveViewerKeypair(signature: Hex): ViewerKeypair {\n const privateKey = privateKeyFromSignature(signature);\n const publicKey = toHex(secp256k1.getPublicKey(hexToBytes(privateKey), false));\n const { x, y } = parsePublicKeyCoordinates(publicKey);\n\n return { privateKey, publicKey, x, y };\n}\n"],"mappings":"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","names":["import_viem","import_viem","import_viem","import_viem","import_viem","import_secp256k1"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Hex } from 'viem';
|
|
2
|
+
import { A as ActionConfig, a as ApproveParams, T as TransferParams, U as UnwrapParams, W as WrapParams, b as TopUpParams, D as DecryptHistoricTransferDataParams, c as DecryptBalanceParams, G as GetTransferIdParams, d as AuthorizeHistoricViewForRangeParams, e as AuthorizeHistoricViewForTransferParams, R as RegisterViewerKeyParams, f as RequestTransferDecryptionParams, g as RevokeHistoricViewParams } from '../types-CBDYydn0.cjs';
|
|
3
|
+
import { T as TransferData } from '../types-WaeCtQlG.cjs';
|
|
4
|
+
import '@skalenetwork/bite';
|
|
5
|
+
|
|
6
|
+
declare function approve(config: ActionConfig, params: ApproveParams): Promise<Hex>;
|
|
7
|
+
declare function transfer(config: ActionConfig, params: TransferParams): Promise<Hex>;
|
|
8
|
+
declare function wrap(config: ActionConfig, params: WrapParams): Promise<Hex>;
|
|
9
|
+
declare function unwrap(config: ActionConfig, params: UnwrapParams): Promise<Hex>;
|
|
10
|
+
|
|
11
|
+
declare function getCtxBalance(config: ActionConfig): Promise<bigint>;
|
|
12
|
+
declare function getCtxFee(config: ActionConfig): Promise<bigint>;
|
|
13
|
+
declare function fundCtxBalance(config: ActionConfig, params: TopUpParams): Promise<Hex>;
|
|
14
|
+
declare function getValueForCtx(config: ActionConfig): Promise<bigint>;
|
|
15
|
+
|
|
16
|
+
declare function decryptTokenBalance(config: ActionConfig, params: DecryptBalanceParams): Promise<bigint>;
|
|
17
|
+
declare function decryptHistoricTransferData(params: DecryptHistoricTransferDataParams): Promise<TransferData>;
|
|
18
|
+
declare function getTransferId(config: ActionConfig, params: GetTransferIdParams): Promise<bigint>;
|
|
19
|
+
|
|
20
|
+
declare function registerViewerKey(config: ActionConfig, params: RegisterViewerKeyParams): Promise<Hex>;
|
|
21
|
+
declare function authorizeHistoricViewForRange(config: ActionConfig, params: AuthorizeHistoricViewForRangeParams): Promise<Hex>;
|
|
22
|
+
declare function authorizeHistoricViewForTransfer(config: ActionConfig, params: AuthorizeHistoricViewForTransferParams): Promise<Hex>;
|
|
23
|
+
declare function revokeHistoricView(config: ActionConfig, params: RevokeHistoricViewParams): Promise<Hex>;
|
|
24
|
+
declare function requestTransferDecryption(config: ActionConfig, params: RequestTransferDecryptionParams): Promise<Hex>;
|
|
25
|
+
|
|
26
|
+
export { ActionConfig, ApproveParams, AuthorizeHistoricViewForRangeParams, AuthorizeHistoricViewForTransferParams, DecryptBalanceParams, DecryptHistoricTransferDataParams, GetTransferIdParams, RegisterViewerKeyParams, RequestTransferDecryptionParams, RevokeHistoricViewParams, TopUpParams, TransferParams, UnwrapParams, WrapParams, approve, authorizeHistoricViewForRange, authorizeHistoricViewForTransfer, decryptHistoricTransferData, decryptTokenBalance, fundCtxBalance, getCtxBalance, getCtxFee, getTransferId, getValueForCtx, registerViewerKey, requestTransferDecryption, revokeHistoricView, transfer, unwrap, wrap };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Hex } from 'viem';
|
|
2
|
+
import { A as ActionConfig, a as ApproveParams, T as TransferParams, U as UnwrapParams, W as WrapParams, b as TopUpParams, D as DecryptHistoricTransferDataParams, c as DecryptBalanceParams, G as GetTransferIdParams, d as AuthorizeHistoricViewForRangeParams, e as AuthorizeHistoricViewForTransferParams, R as RegisterViewerKeyParams, f as RequestTransferDecryptionParams, g as RevokeHistoricViewParams } from '../types-Gn0F4pQf.js';
|
|
3
|
+
import { T as TransferData } from '../types-WaeCtQlG.js';
|
|
4
|
+
import '@skalenetwork/bite';
|
|
5
|
+
|
|
6
|
+
declare function approve(config: ActionConfig, params: ApproveParams): Promise<Hex>;
|
|
7
|
+
declare function transfer(config: ActionConfig, params: TransferParams): Promise<Hex>;
|
|
8
|
+
declare function wrap(config: ActionConfig, params: WrapParams): Promise<Hex>;
|
|
9
|
+
declare function unwrap(config: ActionConfig, params: UnwrapParams): Promise<Hex>;
|
|
10
|
+
|
|
11
|
+
declare function getCtxBalance(config: ActionConfig): Promise<bigint>;
|
|
12
|
+
declare function getCtxFee(config: ActionConfig): Promise<bigint>;
|
|
13
|
+
declare function fundCtxBalance(config: ActionConfig, params: TopUpParams): Promise<Hex>;
|
|
14
|
+
declare function getValueForCtx(config: ActionConfig): Promise<bigint>;
|
|
15
|
+
|
|
16
|
+
declare function decryptTokenBalance(config: ActionConfig, params: DecryptBalanceParams): Promise<bigint>;
|
|
17
|
+
declare function decryptHistoricTransferData(params: DecryptHistoricTransferDataParams): Promise<TransferData>;
|
|
18
|
+
declare function getTransferId(config: ActionConfig, params: GetTransferIdParams): Promise<bigint>;
|
|
19
|
+
|
|
20
|
+
declare function registerViewerKey(config: ActionConfig, params: RegisterViewerKeyParams): Promise<Hex>;
|
|
21
|
+
declare function authorizeHistoricViewForRange(config: ActionConfig, params: AuthorizeHistoricViewForRangeParams): Promise<Hex>;
|
|
22
|
+
declare function authorizeHistoricViewForTransfer(config: ActionConfig, params: AuthorizeHistoricViewForTransferParams): Promise<Hex>;
|
|
23
|
+
declare function revokeHistoricView(config: ActionConfig, params: RevokeHistoricViewParams): Promise<Hex>;
|
|
24
|
+
declare function requestTransferDecryption(config: ActionConfig, params: RequestTransferDecryptionParams): Promise<Hex>;
|
|
25
|
+
|
|
26
|
+
export { ActionConfig, ApproveParams, AuthorizeHistoricViewForRangeParams, AuthorizeHistoricViewForTransferParams, DecryptBalanceParams, DecryptHistoricTransferDataParams, GetTransferIdParams, RegisterViewerKeyParams, RequestTransferDecryptionParams, RevokeHistoricViewParams, TopUpParams, TransferParams, UnwrapParams, WrapParams, approve, authorizeHistoricViewForRange, authorizeHistoricViewForTransfer, decryptHistoricTransferData, decryptTokenBalance, fundCtxBalance, getCtxBalance, getCtxFee, getTransferId, getValueForCtx, registerViewerKey, requestTransferDecryption, revokeHistoricView, transfer, unwrap, wrap };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import {
|
|
2
|
+
approve,
|
|
3
|
+
authorizeHistoricViewForRange,
|
|
4
|
+
authorizeHistoricViewForTransfer,
|
|
5
|
+
decryptHistoricTransferData,
|
|
6
|
+
decryptTokenBalance,
|
|
7
|
+
fundCtxBalance,
|
|
8
|
+
getCtxBalance,
|
|
9
|
+
getCtxFee,
|
|
10
|
+
getTransferId,
|
|
11
|
+
getValueForCtx,
|
|
12
|
+
registerViewerKey,
|
|
13
|
+
requestTransferDecryption,
|
|
14
|
+
revokeHistoricView,
|
|
15
|
+
transfer,
|
|
16
|
+
unwrap,
|
|
17
|
+
wrap
|
|
18
|
+
} from "../chunk-YEII26VS.js";
|
|
19
|
+
import "../chunk-K5WS3F4Q.js";
|
|
20
|
+
export {
|
|
21
|
+
approve,
|
|
22
|
+
authorizeHistoricViewForRange,
|
|
23
|
+
authorizeHistoricViewForTransfer,
|
|
24
|
+
decryptHistoricTransferData,
|
|
25
|
+
decryptTokenBalance,
|
|
26
|
+
fundCtxBalance,
|
|
27
|
+
getCtxBalance,
|
|
28
|
+
getCtxFee,
|
|
29
|
+
getTransferId,
|
|
30
|
+
getValueForCtx,
|
|
31
|
+
registerViewerKey,
|
|
32
|
+
requestTransferDecryption,
|
|
33
|
+
revokeHistoricView,
|
|
34
|
+
transfer,
|
|
35
|
+
unwrap,
|
|
36
|
+
wrap
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// src/utils/crypto.ts
|
|
2
|
+
import { secp256k1 } from "@noble/curves/secp256k1";
|
|
3
|
+
import { sha256 } from "@noble/hashes/sha256";
|
|
4
|
+
import { cbc } from "@noble/ciphers/aes";
|
|
5
|
+
import { bytesToHex, decodeAbiParameters, hexToBytes } from "viem";
|
|
6
|
+
function bytesToBigInt(bytes) {
|
|
7
|
+
if (bytes.length === 0) {
|
|
8
|
+
return 0n;
|
|
9
|
+
}
|
|
10
|
+
const hexValue = bytesToHex(bytes);
|
|
11
|
+
return BigInt(hexValue === "0x" ? "0x0" : hexValue);
|
|
12
|
+
}
|
|
13
|
+
function decryptEciesPayload(encryptedHex, privateKey) {
|
|
14
|
+
const payload = hexToBytes(encryptedHex);
|
|
15
|
+
if (payload.length < 65) {
|
|
16
|
+
throw new Error("Encrypted payload is too short.");
|
|
17
|
+
}
|
|
18
|
+
const iv = payload.slice(0, 16);
|
|
19
|
+
const ephemeralCompressedPublicKey = payload.slice(16, 49);
|
|
20
|
+
const ciphertext = payload.slice(49);
|
|
21
|
+
if (ephemeralCompressedPublicKey.length !== 33) {
|
|
22
|
+
throw new Error("Invalid ephemeral public key length in encrypted payload.");
|
|
23
|
+
}
|
|
24
|
+
if (ciphertext.length === 0 || ciphertext.length % 16 !== 0) {
|
|
25
|
+
throw new Error("Invalid AES-CBC ciphertext length.");
|
|
26
|
+
}
|
|
27
|
+
const sharedSecret = secp256k1.getSharedSecret(
|
|
28
|
+
hexToBytes(privateKey),
|
|
29
|
+
ephemeralCompressedPublicKey,
|
|
30
|
+
true
|
|
31
|
+
);
|
|
32
|
+
const encryptionKey = sha256(sharedSecret.slice(1));
|
|
33
|
+
const keyMaterial = Uint8Array.from(encryptionKey);
|
|
34
|
+
return cbc(keyMaterial, iv).decrypt(ciphertext);
|
|
35
|
+
}
|
|
36
|
+
function tryDecodeTransferData(encoded) {
|
|
37
|
+
try {
|
|
38
|
+
const [from, to, value, timestamp, transferId] = decodeAbiParameters(
|
|
39
|
+
[
|
|
40
|
+
{ type: "address" },
|
|
41
|
+
{ type: "address" },
|
|
42
|
+
{ type: "uint256" },
|
|
43
|
+
{ type: "uint256" },
|
|
44
|
+
{ type: "uint256" }
|
|
45
|
+
],
|
|
46
|
+
encoded
|
|
47
|
+
);
|
|
48
|
+
return { from, to, value, timestamp, transferId };
|
|
49
|
+
} catch {
|
|
50
|
+
return void 0;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function decryptBalance(encryptedHex, privateKey) {
|
|
54
|
+
const plaintext = decryptEciesPayload(encryptedHex, privateKey);
|
|
55
|
+
if (plaintext.length <= 32) {
|
|
56
|
+
return bytesToBigInt(plaintext);
|
|
57
|
+
}
|
|
58
|
+
return bytesToBigInt(plaintext.slice(-32));
|
|
59
|
+
}
|
|
60
|
+
async function decryptTransferData(encryptedHex, privateKey) {
|
|
61
|
+
const plaintext = decryptEciesPayload(encryptedHex, privateKey);
|
|
62
|
+
const direct = tryDecodeTransferData(bytesToHex(plaintext));
|
|
63
|
+
if (direct) {
|
|
64
|
+
return direct;
|
|
65
|
+
}
|
|
66
|
+
const structSizeBytes = 32 * 5;
|
|
67
|
+
if (plaintext.length >= structSizeBytes) {
|
|
68
|
+
const trailing = plaintext.slice(-structSizeBytes);
|
|
69
|
+
const trailingDecoded = tryDecodeTransferData(bytesToHex(trailing));
|
|
70
|
+
if (trailingDecoded) {
|
|
71
|
+
return trailingDecoded;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
throw new Error("Unable to decode decrypted transfer payload as TransferData struct.");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// src/utils/viewerKey.ts
|
|
78
|
+
import { hexToBytes as hexToBytes2, isAddressEqual, keccak256, toHex, zeroAddress } from "viem";
|
|
79
|
+
import { publicKeyToAddress } from "viem/utils";
|
|
80
|
+
import { secp256k1 as secp256k12 } from "@noble/curves/secp256k1";
|
|
81
|
+
function privateKeyFromSignature(signature) {
|
|
82
|
+
let candidate = keccak256(hexToBytes2(signature));
|
|
83
|
+
for (let i = 0; i < 16; i += 1) {
|
|
84
|
+
if (secp256k12.utils.isValidSecretKey(hexToBytes2(candidate))) {
|
|
85
|
+
return candidate;
|
|
86
|
+
}
|
|
87
|
+
candidate = keccak256(hexToBytes2(candidate));
|
|
88
|
+
}
|
|
89
|
+
throw new Error("Unable to derive a valid deterministic private key from signature.");
|
|
90
|
+
}
|
|
91
|
+
function parsePublicKeyCoordinates(publicKey) {
|
|
92
|
+
const raw = publicKey.startsWith("0x04") ? publicKey.slice(4) : publicKey.slice(2);
|
|
93
|
+
if (raw.length !== 128) {
|
|
94
|
+
throw new Error("Public key must be an uncompressed key (65 bytes with 0x04 prefix).");
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
x: `0x${raw.slice(0, 64)}`,
|
|
98
|
+
y: `0x${raw.slice(64, 128)}`
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function deriveAddressFromPublicKey(publicKey) {
|
|
102
|
+
const key = publicKey.startsWith("0x04") ? publicKey : `0x04${publicKey.slice(2)}`;
|
|
103
|
+
return publicKeyToAddress(key);
|
|
104
|
+
}
|
|
105
|
+
function validateViewerKey(publicKey, expectedViewerAddress) {
|
|
106
|
+
if (!expectedViewerAddress) {
|
|
107
|
+
return void 0;
|
|
108
|
+
}
|
|
109
|
+
if (isAddressEqual(expectedViewerAddress, zeroAddress)) {
|
|
110
|
+
return void 0;
|
|
111
|
+
}
|
|
112
|
+
const derivedViewerAddress = deriveAddressFromPublicKey(publicKey);
|
|
113
|
+
if (!isAddressEqual(derivedViewerAddress, expectedViewerAddress)) {
|
|
114
|
+
return "Public key does not match the registered viewer address.";
|
|
115
|
+
}
|
|
116
|
+
return void 0;
|
|
117
|
+
}
|
|
118
|
+
function deriveViewerKeypair(signature) {
|
|
119
|
+
const privateKey = privateKeyFromSignature(signature);
|
|
120
|
+
const publicKey = toHex(secp256k12.getPublicKey(hexToBytes2(privateKey), false));
|
|
121
|
+
const { x, y } = parsePublicKeyCoordinates(publicKey);
|
|
122
|
+
return { privateKey, publicKey, x, y };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export {
|
|
126
|
+
decryptEciesPayload,
|
|
127
|
+
decryptBalance,
|
|
128
|
+
decryptTransferData,
|
|
129
|
+
parsePublicKeyCoordinates,
|
|
130
|
+
deriveAddressFromPublicKey,
|
|
131
|
+
validateViewerKey,
|
|
132
|
+
deriveViewerKeypair
|
|
133
|
+
};
|
|
134
|
+
//# sourceMappingURL=chunk-K5WS3F4Q.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/crypto.ts","../src/utils/viewerKey.ts"],"sourcesContent":["import { secp256k1 } from \"@noble/curves/secp256k1\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { cbc } from \"@noble/ciphers/aes\";\nimport { bytesToHex, decodeAbiParameters, hexToBytes, type Hex } from \"viem\";\n\nimport type { TransferData } from \"../types.js\";\n\nfunction bytesToBigInt(bytes: Uint8Array): bigint {\n if (bytes.length === 0) {\n return 0n;\n }\n const hexValue = bytesToHex(bytes);\n return BigInt(hexValue === \"0x\" ? \"0x0\" : hexValue);\n}\n\nexport function decryptEciesPayload(encryptedHex: Hex, privateKey: Hex): Uint8Array {\n const payload = hexToBytes(encryptedHex);\n\n if (payload.length < 65) {\n throw new Error(\"Encrypted payload is too short.\");\n }\n\n const iv = payload.slice(0, 16);\n const ephemeralCompressedPublicKey = payload.slice(16, 49);\n const ciphertext = payload.slice(49);\n\n if (ephemeralCompressedPublicKey.length !== 33) {\n throw new Error(\"Invalid ephemeral public key length in encrypted payload.\");\n }\n\n if (ciphertext.length === 0 || ciphertext.length % 16 !== 0) {\n throw new Error(\"Invalid AES-CBC ciphertext length.\");\n }\n\n const sharedSecret = secp256k1.getSharedSecret(\n hexToBytes(privateKey),\n ephemeralCompressedPublicKey,\n true,\n );\n const encryptionKey = sha256(sharedSecret.slice(1));\n const keyMaterial = Uint8Array.from(encryptionKey);\n\n return cbc(keyMaterial, iv).decrypt(ciphertext);\n}\n\nfunction tryDecodeTransferData(encoded: Hex): TransferData | undefined {\n try {\n const [from, to, value, timestamp, transferId] = decodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"address\" },\n { type: \"uint256\" },\n { type: \"uint256\" },\n { type: \"uint256\" },\n ],\n encoded,\n );\n\n return { from, to, value, timestamp, transferId };\n } catch {\n return undefined;\n }\n}\n\nexport async function decryptBalance(encryptedHex: Hex, privateKey: Hex): Promise<bigint> {\n const plaintext = decryptEciesPayload(encryptedHex, privateKey);\n\n if (plaintext.length <= 32) {\n return bytesToBigInt(plaintext);\n }\n\n return bytesToBigInt(plaintext.slice(-32));\n}\n\nexport async function decryptTransferData(\n encryptedHex: Hex,\n privateKey: Hex,\n): Promise<TransferData> {\n const plaintext = decryptEciesPayload(encryptedHex, privateKey);\n\n const direct = tryDecodeTransferData(bytesToHex(plaintext));\n if (direct) {\n return direct;\n }\n\n const structSizeBytes = 32 * 5;\n if (plaintext.length >= structSizeBytes) {\n const trailing = plaintext.slice(-structSizeBytes);\n const trailingDecoded = tryDecodeTransferData(bytesToHex(trailing));\n if (trailingDecoded) {\n return trailingDecoded;\n }\n }\n\n throw new Error(\"Unable to decode decrypted transfer payload as TransferData struct.\");\n}\n","import { type Hex, hexToBytes, isAddressEqual, keccak256, toHex, zeroAddress } from \"viem\";\nimport { publicKeyToAddress } from \"viem/utils\";\nimport { secp256k1 } from \"@noble/curves/secp256k1\";\n\nimport type { ViewerKeypair } from \"../types.js\";\n\nfunction privateKeyFromSignature(signature: Hex): Hex {\n let candidate = keccak256(hexToBytes(signature));\n\n for (let i = 0; i < 16; i += 1) {\n if (secp256k1.utils.isValidSecretKey(hexToBytes(candidate))) {\n return candidate;\n }\n candidate = keccak256(hexToBytes(candidate));\n }\n\n throw new Error(\"Unable to derive a valid deterministic private key from signature.\");\n}\n\nexport function parsePublicKeyCoordinates(publicKey: Hex): { x: Hex; y: Hex } {\n const raw = publicKey.startsWith(\"0x04\") ? publicKey.slice(4) : publicKey.slice(2);\n\n if (raw.length !== 128) {\n throw new Error(\"Public key must be an uncompressed key (65 bytes with 0x04 prefix).\");\n }\n\n return {\n x: `0x${raw.slice(0, 64)}` as Hex,\n y: `0x${raw.slice(64, 128)}` as Hex,\n };\n}\n\nexport function deriveAddressFromPublicKey(publicKey: Hex): Hex {\n const key = publicKey.startsWith(\"0x04\") ? publicKey : (`0x04${publicKey.slice(2)}` as Hex);\n return publicKeyToAddress(key) as Hex;\n}\n\nexport function validateViewerKey(publicKey: Hex, expectedViewerAddress?: Hex): string | undefined {\n if (!expectedViewerAddress) {\n return undefined;\n }\n\n if (isAddressEqual(expectedViewerAddress, zeroAddress)) {\n return undefined;\n }\n\n const derivedViewerAddress = deriveAddressFromPublicKey(publicKey);\n if (!isAddressEqual(derivedViewerAddress, expectedViewerAddress)) {\n return \"Public key does not match the registered viewer address.\";\n }\n\n return undefined;\n}\n\nexport function deriveViewerKeypair(signature: Hex): ViewerKeypair {\n const privateKey = privateKeyFromSignature(signature);\n const publicKey = toHex(secp256k1.getPublicKey(hexToBytes(privateKey), false));\n const { x, y } = parsePublicKeyCoordinates(publicKey);\n\n return { privateKey, publicKey, x, y };\n}\n"],"mappings":"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","names":["hexToBytes","secp256k1"]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// src/utils/ctx.ts
|
|
2
|
+
function createCtxPromise(txHashPromise, publicClient) {
|
|
3
|
+
const promise = txHashPromise;
|
|
4
|
+
promise.waitForCtx = async () => {
|
|
5
|
+
const txHash = await txHashPromise;
|
|
6
|
+
return waitForCtx(txHash, publicClient);
|
|
7
|
+
};
|
|
8
|
+
return promise;
|
|
9
|
+
}
|
|
10
|
+
function normalizeHex(value) {
|
|
11
|
+
const trimmed = value.trim();
|
|
12
|
+
if (/^0x[0-9a-fA-F]+$/.test(trimmed)) {
|
|
13
|
+
return trimmed;
|
|
14
|
+
}
|
|
15
|
+
if (/^[0-9a-fA-F]+$/.test(trimmed)) {
|
|
16
|
+
return `0x${trimmed}`;
|
|
17
|
+
}
|
|
18
|
+
return void 0;
|
|
19
|
+
}
|
|
20
|
+
function findFirstHex(value) {
|
|
21
|
+
if (typeof value === "string") {
|
|
22
|
+
return normalizeHex(value);
|
|
23
|
+
}
|
|
24
|
+
if (Array.isArray(value)) {
|
|
25
|
+
for (const item of value) {
|
|
26
|
+
const candidate = findFirstHex(item);
|
|
27
|
+
if (candidate) {
|
|
28
|
+
return candidate;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return void 0;
|
|
32
|
+
}
|
|
33
|
+
if (value && typeof value === "object") {
|
|
34
|
+
for (const child of Object.values(value)) {
|
|
35
|
+
const candidate = findFirstHex(child);
|
|
36
|
+
if (candidate) {
|
|
37
|
+
return candidate;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return void 0;
|
|
42
|
+
}
|
|
43
|
+
function collectHexValues(value, acc) {
|
|
44
|
+
if (typeof value === "string") {
|
|
45
|
+
const normalized = normalizeHex(value);
|
|
46
|
+
if (normalized) {
|
|
47
|
+
acc.push(normalized);
|
|
48
|
+
}
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (Array.isArray(value)) {
|
|
52
|
+
for (const item of value) {
|
|
53
|
+
collectHexValues(item, acc);
|
|
54
|
+
}
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (value && typeof value === "object") {
|
|
58
|
+
for (const child of Object.values(value)) {
|
|
59
|
+
collectHexValues(child, acc);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function callBiteGetCraftedCtxs(publicClient, txHash) {
|
|
64
|
+
return publicClient.request({
|
|
65
|
+
method: "bite_getCraftedCtxs",
|
|
66
|
+
params: [txHash]
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async function getCtxHash(publicClient, txHash) {
|
|
70
|
+
const result = await callBiteGetCraftedCtxs(publicClient, txHash);
|
|
71
|
+
return findFirstHex(result);
|
|
72
|
+
}
|
|
73
|
+
async function getCtxHashes(publicClient, txHash) {
|
|
74
|
+
const result = await callBiteGetCraftedCtxs(publicClient, txHash);
|
|
75
|
+
const allHexes = [];
|
|
76
|
+
collectHexValues(result, allHexes);
|
|
77
|
+
const deduped = /* @__PURE__ */ new Map();
|
|
78
|
+
for (const hash of allHexes) {
|
|
79
|
+
deduped.set(hash.toLowerCase(), hash);
|
|
80
|
+
}
|
|
81
|
+
return Array.from(deduped.values());
|
|
82
|
+
}
|
|
83
|
+
async function waitForCtx(txHash, publicClient) {
|
|
84
|
+
const originReceipt = await publicClient.waitForTransactionReceipt({ hash: txHash });
|
|
85
|
+
const ctxHash = await getCtxHash(publicClient, txHash);
|
|
86
|
+
if (!ctxHash) {
|
|
87
|
+
throw new Error(`No crafted CTX found for tx ${txHash}.`);
|
|
88
|
+
}
|
|
89
|
+
const ctxReceipt = await publicClient.waitForTransactionReceipt({ hash: ctxHash });
|
|
90
|
+
return { originHash: txHash, originReceipt, ctxHash, ctxReceipt };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export {
|
|
94
|
+
createCtxPromise,
|
|
95
|
+
getCtxHash,
|
|
96
|
+
getCtxHashes,
|
|
97
|
+
waitForCtx
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=chunk-Y6NM73JA.js.map
|