@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.
@@ -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