@haneullabs/zksend 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/CHANGELOG.md +1084 -0
  2. package/README.md +1 -0
  3. package/dist/cjs/index.d.ts +7 -0
  4. package/dist/cjs/index.js +38 -0
  5. package/dist/cjs/index.js.map +7 -0
  6. package/dist/cjs/index.test.d.ts +4 -0
  7. package/dist/cjs/links/builder.d.ts +55 -0
  8. package/dist/cjs/links/builder.js +361 -0
  9. package/dist/cjs/links/builder.js.map +7 -0
  10. package/dist/cjs/links/claim.d.ts +57 -0
  11. package/dist/cjs/links/claim.js +573 -0
  12. package/dist/cjs/links/claim.js.map +7 -0
  13. package/dist/cjs/links/get-sent-transactions.d.ts +25 -0
  14. package/dist/cjs/links/get-sent-transactions.js +134 -0
  15. package/dist/cjs/links/get-sent-transactions.js.map +7 -0
  16. package/dist/cjs/links/list-created-links.d.ts +24 -0
  17. package/dist/cjs/links/list-created-links.js +124 -0
  18. package/dist/cjs/links/list-created-links.js.map +7 -0
  19. package/dist/cjs/links/utils.d.ts +34 -0
  20. package/dist/cjs/links/utils.js +132 -0
  21. package/dist/cjs/links/utils.js.map +7 -0
  22. package/dist/cjs/links/zk-bag.d.ts +72 -0
  23. package/dist/cjs/links/zk-bag.js +145 -0
  24. package/dist/cjs/links/zk-bag.js.map +7 -0
  25. package/dist/cjs/package.json +5 -0
  26. package/dist/esm/index.d.ts +7 -0
  27. package/dist/esm/index.js +20 -0
  28. package/dist/esm/index.js.map +7 -0
  29. package/dist/esm/index.test.d.ts +4 -0
  30. package/dist/esm/links/builder.d.ts +55 -0
  31. package/dist/esm/links/builder.js +341 -0
  32. package/dist/esm/links/builder.js.map +7 -0
  33. package/dist/esm/links/claim.d.ts +57 -0
  34. package/dist/esm/links/claim.js +561 -0
  35. package/dist/esm/links/claim.js.map +7 -0
  36. package/dist/esm/links/get-sent-transactions.d.ts +25 -0
  37. package/dist/esm/links/get-sent-transactions.js +114 -0
  38. package/dist/esm/links/get-sent-transactions.js.map +7 -0
  39. package/dist/esm/links/list-created-links.d.ts +24 -0
  40. package/dist/esm/links/list-created-links.js +104 -0
  41. package/dist/esm/links/list-created-links.js.map +7 -0
  42. package/dist/esm/links/utils.d.ts +34 -0
  43. package/dist/esm/links/utils.js +112 -0
  44. package/dist/esm/links/utils.js.map +7 -0
  45. package/dist/esm/links/zk-bag.d.ts +72 -0
  46. package/dist/esm/links/zk-bag.js +125 -0
  47. package/dist/esm/links/zk-bag.js.map +7 -0
  48. package/dist/esm/package.json +5 -0
  49. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  50. package/dist/tsconfig.tsbuildinfo +1 -0
  51. package/experimental/unified-adapter/package.json +6 -0
  52. package/package.json +60 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/links/claim.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@haneullabs/haneul/bcs';\nimport { getFullnodeUrl, HaneulClient } from '@haneullabs/haneul/client';\nimport type {\n\tCoinStruct,\n\tHaneulObjectData,\n\tHaneulTransaction,\n\tHaneulTransactionBlockResponse,\n} from '@haneullabs/haneul/client';\nimport type { Keypair } from '@haneullabs/haneul/cryptography';\nimport { Ed25519Keypair } from '@haneullabs/haneul/keypairs/ed25519';\nimport type { TransactionObjectArgument } from '@haneullabs/haneul/transactions';\nimport { Transaction } from '@haneullabs/haneul/transactions';\nimport {\n\tfromBase64,\n\tnormalizeStructTag,\n\tnormalizeHaneulAddress,\n\tnormalizeHaneulObjectId,\n\tparseStructTag,\n\tHANEUL_TYPE_ARG,\n\ttoBase64,\n} from '@haneullabs/haneul/utils';\n\nimport type { ZkSendLinkBuilderOptions } from './builder.js';\nimport { ZkSendLinkBuilder } from './builder.js';\nimport type { LinkAssets } from './utils.js';\nimport { getAssetsFromTransaction, isOwner, ownedAfterChange } from './utils.js';\nimport type { ZkBagContractOptions } from './zk-bag.js';\nimport { getContractIds, ZkBag } from './zk-bag.js';\n\nconst DEFAULT_ZK_SEND_LINK_OPTIONS = {\n\thost: 'https://api.slush.app',\n\tpath: '/claim',\n\tnetwork: 'mainnet' as const,\n};\n\nconst HANEUL_COIN_TYPE = normalizeStructTag(HANEUL_TYPE_ARG);\nconst HANEUL_COIN_OBJECT_TYPE = normalizeStructTag('0x2::coin::Coin<0x2::haneul::HANEUL>');\n\nexport type ZkSendLinkOptions = {\n\tclaimApi?: string;\n\tkeypair?: Keypair;\n\tclient?: HaneulClient;\n\tnetwork?: 'mainnet' | 'testnet';\n\thost?: string;\n\tpath?: string;\n\taddress?: string;\n\tisContractLink: boolean;\n\tcontract?: ZkBagContractOptions | null;\n} & (\n\t| {\n\t\t\taddress: string;\n\t\t\tkeypair?: never;\n\t }\n\t| {\n\t\t\tkeypair: Keypair;\n\t\t\taddress?: never;\n\t }\n);\n\nexport class ZkSendLink {\n\taddress: string;\n\tkeypair?: Keypair;\n\tcreatorAddress?: string;\n\tassets?: LinkAssets;\n\tclaimed?: boolean;\n\tclaimedBy?: string;\n\tbagObject?: HaneulObjectData | null;\n\n\t#client: HaneulClient;\n\t#contract?: ZkBag<ZkBagContractOptions>;\n\t#network: 'mainnet' | 'testnet';\n\t#host: string;\n\t#path: string;\n\t#claimApi: string;\n\n\t// State for non-contract based links\n\t#gasCoin?: CoinStruct;\n\t#hasSui = false;\n\t#ownedObjects: {\n\t\tobjectId: string;\n\t\tversion: string;\n\t\tdigest: string;\n\t\ttype: string;\n\t}[] = [];\n\n\tconstructor({\n\t\tnetwork = DEFAULT_ZK_SEND_LINK_OPTIONS.network,\n\t\tclient = new HaneulClient({ url: getFullnodeUrl(network) }),\n\t\tkeypair,\n\t\tcontract = getContractIds(network),\n\t\taddress,\n\t\thost = DEFAULT_ZK_SEND_LINK_OPTIONS.host,\n\t\tpath = DEFAULT_ZK_SEND_LINK_OPTIONS.path,\n\t\tclaimApi = `${host}/api`,\n\t\tisContractLink,\n\t}: ZkSendLinkOptions) {\n\t\tif (!keypair && !address) {\n\t\t\tthrow new Error('Either keypair or address must be provided');\n\t\t}\n\n\t\tthis.#client = client;\n\t\tthis.keypair = keypair;\n\t\tthis.address = address ?? keypair!.toHaneulAddress();\n\t\tthis.#claimApi = claimApi;\n\t\tthis.#network = network;\n\t\tthis.#host = host;\n\t\tthis.#path = path;\n\n\t\tif (isContractLink) {\n\t\t\tif (!contract) {\n\t\t\t\tthrow new Error('Contract options are required for contract based links');\n\t\t\t}\n\n\t\t\tthis.#contract = new ZkBag(contract.packageId, contract);\n\t\t}\n\t}\n\n\tstatic async fromUrl(\n\t\turl: string,\n\t\toptions: Omit<ZkSendLinkOptions, 'keypair' | 'address' | 'isContractLink'> = {},\n\t) {\n\t\tconst parsed = new URL(url);\n\t\tconst isContractLink = parsed.hash.startsWith('#$');\n\t\tconst parsedNetwork = parsed.searchParams.get('network') === 'testnet' ? 'testnet' : 'mainnet';\n\t\tconst network = options.network ?? parsedNetwork;\n\n\t\tlet link: ZkSendLink;\n\t\tif (isContractLink) {\n\t\t\tconst keypair = Ed25519Keypair.fromSecretKey(fromBase64(parsed.hash.slice(2)));\n\t\t\tlink = new ZkSendLink({\n\t\t\t\t...options,\n\t\t\t\tkeypair,\n\t\t\t\tnetwork,\n\t\t\t\thost: `${parsed.protocol}//${parsed.host}`,\n\t\t\t\tpath: parsed.pathname,\n\t\t\t\tisContractLink: true,\n\t\t\t});\n\t\t} else {\n\t\t\tconst keypair = Ed25519Keypair.fromSecretKey(\n\t\t\t\tfromBase64(isContractLink ? parsed.hash.slice(2) : parsed.hash.slice(1)),\n\t\t\t);\n\t\t\tlink = new ZkSendLink({\n\t\t\t\t...options,\n\t\t\t\tkeypair,\n\t\t\t\tnetwork,\n\t\t\t\thost: `${parsed.protocol}//${parsed.host}`,\n\t\t\t\tpath: parsed.pathname,\n\t\t\t\tisContractLink: false,\n\t\t\t});\n\t\t}\n\n\t\tawait link.loadAssets();\n\n\t\treturn link;\n\t}\n\n\tstatic async fromAddress(\n\t\taddress: string,\n\t\toptions: Omit<ZkSendLinkOptions, 'keypair' | 'address' | 'isContractLink'>,\n\t) {\n\t\tconst link = new ZkSendLink({\n\t\t\t...options,\n\t\t\taddress,\n\t\t\tisContractLink: true,\n\t\t});\n\n\t\tawait link.loadAssets();\n\n\t\treturn link;\n\t}\n\n\tasync loadClaimedStatus() {\n\t\tawait this.#loadBag({ loadAssets: false });\n\t}\n\n\tasync loadAssets(\n\t\toptions: {\n\t\t\ttransaction?: HaneulTransactionBlockResponse;\n\t\t\tloadAssets?: boolean;\n\t\t\tloadClaimedAssets?: boolean;\n\t\t} = {},\n\t) {\n\t\tif (this.#contract) {\n\t\t\tawait this.#loadBag(options);\n\t\t} else {\n\t\t\tawait this.#loadOwnedObjects(options);\n\t\t}\n\t}\n\n\tasync claimAssets(\n\t\taddress: string,\n\t\t{\n\t\t\treclaim,\n\t\t\tsign,\n\t\t}:\n\t\t\t| { reclaim?: false; sign?: never }\n\t\t\t| {\n\t\t\t\t\treclaim: true;\n\t\t\t\t\tsign: (transaction: Uint8Array) => Promise<string>;\n\t\t\t } = {},\n\t) {\n\t\tif (!this.keypair && !sign) {\n\t\t\tthrow new Error('Cannot claim assets without links keypair');\n\t\t}\n\n\t\tif (this.claimed) {\n\t\t\tthrow new Error('Assets have already been claimed');\n\t\t}\n\n\t\tif (!this.assets) {\n\t\t\tthrow new Error(\n\t\t\t\t'Link assets could not be loaded. Link has not been indexed or has already been claimed',\n\t\t\t);\n\t\t}\n\n\t\tif (!this.#contract) {\n\t\t\tconst bytes = await this.createClaimTransaction(address).build({\n\t\t\t\tclient: this.#client,\n\t\t\t});\n\t\t\tconst signature = sign\n\t\t\t\t? await sign(bytes)\n\t\t\t\t: (await this.keypair!.signTransaction(bytes)).signature;\n\n\t\t\treturn this.#client.executeTransactionBlock({\n\t\t\t\ttransactionBlock: bytes,\n\t\t\t\tsignature,\n\t\t\t});\n\t\t}\n\n\t\tif (!this.assets) {\n\t\t\tawait this.#loadBag();\n\t\t}\n\n\t\tconst tx = this.createClaimTransaction(address, { reclaim });\n\n\t\tconst sponsored = await this.#createSponsoredTransaction(\n\t\t\ttx,\n\t\t\taddress,\n\t\t\treclaim ? address : this.keypair!.toHaneulAddress(),\n\t\t);\n\n\t\tconst bytes = fromBase64(sponsored.bytes);\n\t\tconst signature = sign\n\t\t\t? await sign(bytes)\n\t\t\t: (await this.keypair!.signTransaction(bytes)).signature;\n\n\t\tconst { digest } = await this.#executeSponsoredTransaction(sponsored, signature);\n\n\t\tconst result = await this.#client.waitForTransaction({\n\t\t\tdigest,\n\t\t\toptions: { showEffects: true },\n\t\t});\n\n\t\tif (result.effects?.status.status !== 'success') {\n\t\t\tthrow new Error(\n\t\t\t\t`Claim transaction failed: ${result.effects?.status.error ?? 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tcreateClaimTransaction(\n\t\taddress: string,\n\t\t{\n\t\t\treclaim,\n\t\t}: {\n\t\t\treclaim?: boolean;\n\t\t} = {},\n\t) {\n\t\tif (!this.#contract) {\n\t\t\treturn this.#createNonContractClaimTransaction(address);\n\t\t}\n\n\t\tif (!this.keypair && !reclaim) {\n\t\t\tthrow new Error('Cannot claim assets without the links keypair');\n\t\t}\n\n\t\tconst tx = new Transaction();\n\t\tconst sender = reclaim ? address : this.keypair!.toHaneulAddress();\n\t\ttx.setSender(sender);\n\n\t\tconst store = tx.object(this.#contract.ids.bagStoreId);\n\t\tconst command = reclaim\n\t\t\t? this.#contract.reclaim({ arguments: [store, this.address] })\n\t\t\t: this.#contract.init_claim({ arguments: [store] });\n\n\t\tconst [bag, proof] = tx.add(command);\n\n\t\tconst objectsToTransfer: TransactionObjectArgument[] = [];\n\n\t\tconst objects = [...(this.assets?.coins ?? []), ...(this.assets?.nfts ?? [])];\n\n\t\tfor (const object of objects) {\n\t\t\tobjectsToTransfer.push(\n\t\t\t\tthis.#contract.claim({\n\t\t\t\t\targuments: [\n\t\t\t\t\t\tbag,\n\t\t\t\t\t\tproof,\n\t\t\t\t\t\ttx.receivingRef({\n\t\t\t\t\t\t\tobjectId: object.objectId,\n\t\t\t\t\t\t\tversion: object.version,\n\t\t\t\t\t\t\tdigest: object.digest,\n\t\t\t\t\t\t}),\n\t\t\t\t\t],\n\t\t\t\t\ttypeArguments: [object.type],\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (objectsToTransfer.length > 0) {\n\t\t\ttx.transferObjects(objectsToTransfer, address);\n\t\t}\n\n\t\ttx.add(this.#contract.finalize({ arguments: [bag, proof] }));\n\n\t\treturn tx;\n\t}\n\n\tasync createRegenerateTransaction(\n\t\tsender: string,\n\t\toptions: Omit<ZkSendLinkBuilderOptions, 'sender'> = {},\n\t) {\n\t\tif (!this.assets) {\n\t\t\tawait this.#loadBag();\n\t\t}\n\n\t\tif (this.claimed) {\n\t\t\tthrow new Error('Assets have already been claimed');\n\t\t}\n\n\t\tif (!this.#contract) {\n\t\t\tthrow new Error('Regenerating non-contract based links is not supported');\n\t\t}\n\n\t\tconst tx = new Transaction();\n\t\ttx.setSender(sender);\n\n\t\tconst store = tx.object(this.#contract.ids.bagStoreId);\n\n\t\tconst newLinkKp = Ed25519Keypair.generate();\n\n\t\tconst newLink = new ZkSendLinkBuilder({\n\t\t\t...options,\n\t\t\tsender,\n\t\t\tclient: this.#client,\n\t\t\tcontract: this.#contract.ids,\n\t\t\thost: this.#host,\n\t\t\tpath: this.#path,\n\t\t\tkeypair: newLinkKp,\n\t\t});\n\n\t\tconst to = tx.pure.address(newLinkKp.toHaneulAddress());\n\n\t\ttx.add(this.#contract.update_receiver({ arguments: [store, this.address, to] }));\n\n\t\treturn {\n\t\t\turl: newLink.getLink(),\n\t\t\ttransaction: tx,\n\t\t};\n\t}\n\n\tasync #loadBagObject() {\n\t\tif (!this.#contract) {\n\t\t\tthrow new Error('Cannot load bag object for non-contract based links');\n\t\t}\n\t\tconst bagField = await this.#client.getDynamicFieldObject({\n\t\t\tparentId: this.#contract.ids.bagStoreTableId,\n\t\t\tname: {\n\t\t\t\ttype: 'address',\n\t\t\t\tvalue: this.address,\n\t\t\t},\n\t\t});\n\n\t\tthis.bagObject = bagField.data;\n\n\t\tif (this.bagObject) {\n\t\t\tthis.claimed = false;\n\t\t}\n\t}\n\n\tasync #loadBag({\n\t\ttransaction,\n\t\tloadAssets = true,\n\t\tloadClaimedAssets = loadAssets,\n\t}: {\n\t\ttransaction?: HaneulTransactionBlockResponse;\n\t\tloadAssets?: boolean;\n\t\tloadClaimedAssets?: boolean;\n\t} = {}) {\n\t\tif (!this.#contract) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.bagObject || !this.claimed) {\n\t\t\tawait this.#loadBagObject();\n\t\t}\n\n\t\tif (!loadAssets) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.bagObject) {\n\t\t\tif (loadClaimedAssets) {\n\t\t\t\tawait this.#loadClaimedAssets();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst bagId = (this.bagObject as any).content.fields.value.fields?.id?.id;\n\n\t\tif (bagId && transaction?.balanceChanges && transaction.objectChanges) {\n\t\t\tthis.assets = getAssetsFromTransaction({\n\t\t\t\ttransaction,\n\t\t\t\taddress: bagId,\n\t\t\t\tisSent: false,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst itemIds: string[] | undefined = (this.bagObject as any)?.content?.fields?.value?.fields\n\t\t\t?.item_ids.fields.contents;\n\n\t\tthis.creatorAddress = (this.bagObject as any)?.content?.fields?.value?.fields?.owner;\n\n\t\tif (!itemIds) {\n\t\t\tthrow new Error('Invalid bag field');\n\t\t}\n\n\t\tconst objectsResponse = await this.#client.multiGetObjects({\n\t\t\tids: itemIds,\n\t\t\toptions: {\n\t\t\t\tshowType: true,\n\t\t\t\tshowContent: true,\n\t\t\t},\n\t\t});\n\n\t\tthis.assets = {\n\t\t\tbalances: [],\n\t\t\tnfts: [],\n\t\t\tcoins: [],\n\t\t};\n\n\t\tconst balances = new Map<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tcoinType: string;\n\t\t\t\tamount: bigint;\n\t\t\t}\n\t\t>();\n\n\t\tobjectsResponse.forEach((object, i) => {\n\t\t\tif (!object.data || !object.data.type) {\n\t\t\t\tthrow new Error(`Failed to load claimable object ${itemIds[i]}`);\n\t\t\t}\n\n\t\t\tconst type = parseStructTag(normalizeStructTag(object.data.type));\n\n\t\t\tif (\n\t\t\t\ttype.address === normalizeHaneulAddress('0x2') &&\n\t\t\t\ttype.module === 'coin' &&\n\t\t\t\ttype.name === 'Coin'\n\t\t\t) {\n\t\t\t\tthis.assets!.coins.push({\n\t\t\t\t\tobjectId: object.data.objectId,\n\t\t\t\t\ttype: object.data.type,\n\t\t\t\t\tversion: object.data.version,\n\t\t\t\t\tdigest: object.data.digest,\n\t\t\t\t});\n\n\t\t\t\tif (object.data.content?.dataType === 'moveObject') {\n\t\t\t\t\tconst amount = BigInt((object.data.content.fields as Record<string, string>).balance);\n\t\t\t\t\tconst coinType = normalizeStructTag(\n\t\t\t\t\t\tparseStructTag(object.data.content.type).typeParams[0],\n\t\t\t\t\t);\n\t\t\t\t\tif (!balances.has(coinType)) {\n\t\t\t\t\t\tbalances.set(coinType, { coinType, amount });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbalances.get(coinType)!.amount += amount;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.assets!.nfts.push({\n\t\t\t\t\tobjectId: object.data.objectId,\n\t\t\t\t\ttype: object.data.type,\n\t\t\t\t\tversion: object.data.version,\n\t\t\t\t\tdigest: object.data.digest,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tthis.assets.balances = [...balances.values()];\n\t}\n\n\tasync #loadClaimedAssets() {\n\t\tconst result = await this.#client.queryTransactionBlocks({\n\t\t\tlimit: 1,\n\t\t\tfilter: {\n\t\t\t\tFromAddress: this.address,\n\t\t\t},\n\t\t\toptions: {\n\t\t\t\tshowObjectChanges: true,\n\t\t\t\tshowBalanceChanges: true,\n\t\t\t\tshowInput: true,\n\t\t\t},\n\t\t});\n\n\t\tif (!result?.data[0]) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst [tx] = result.data;\n\n\t\tif (tx.transaction?.data.transaction.kind !== 'ProgrammableTransaction') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst transfer = tx.transaction.data.transaction.transactions.findLast(\n\t\t\t(tx): tx is Extract<HaneulTransaction, { TransferObjects: unknown }> => 'TransferObjects' in tx,\n\t\t);\n\n\t\tif (!transfer) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst receiverArg = transfer.TransferObjects[1];\n\n\t\tif (!(typeof receiverArg === 'object' && 'Input' in receiverArg)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst input = tx.transaction.data.transaction.inputs[receiverArg.Input];\n\n\t\tif (input.type !== 'pure') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst receiver =\n\t\t\ttypeof input.value === 'string'\n\t\t\t\t? input.value\n\t\t\t\t: bcs.Address.parse(new Uint8Array((input.value as { Pure: number[] }).Pure));\n\n\t\tthis.claimed = true;\n\t\tthis.claimedBy = receiver;\n\t\tthis.assets = getAssetsFromTransaction({\n\t\t\ttransaction: tx,\n\t\t\taddress: receiver,\n\t\t\tisSent: false,\n\t\t});\n\t}\n\n\tasync #createSponsoredTransaction(tx: Transaction, claimer: string, sender: string) {\n\t\treturn this.#fetch<{ digest: string; bytes: string }>('transaction-blocks/sponsor', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: JSON.stringify({\n\t\t\t\tnetwork: this.#network,\n\t\t\t\tsender,\n\t\t\t\tclaimer,\n\t\t\t\ttransactionBlockKindBytes: toBase64(\n\t\t\t\t\tawait tx.build({\n\t\t\t\t\t\tonlyTransactionKind: true,\n\t\t\t\t\t\tclient: this.#client,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync #executeSponsoredTransaction(input: { digest: string; bytes: string }, signature: string) {\n\t\treturn this.#fetch<{ digest: string }>(`transaction-blocks/sponsor/${input.digest}`, {\n\t\t\tmethod: 'POST',\n\t\t\tbody: JSON.stringify({\n\t\t\t\tsignature,\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync #fetch<T = unknown>(path: string, init: RequestInit): Promise<T> {\n\t\tconst res = await fetch(`${this.#claimApi}/v1/${path}`, {\n\t\t\t...init,\n\t\t\theaders: {\n\t\t\t\t...init.headers,\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t},\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tconsole.error(`${this.#claimApi}/v1/${path}`, await res.text());\n\t\t\tthrow new Error(`Request to claim API failed with status code ${res.status}`);\n\t\t}\n\n\t\tconst { data } = await res.json();\n\n\t\treturn data as T;\n\t}\n\n\tasync #listNonContractClaimableAssets() {\n\t\tconst balances: {\n\t\t\tcoinType: string;\n\t\t\tamount: bigint;\n\t\t}[] = [];\n\n\t\tconst nfts: {\n\t\t\tobjectId: string;\n\t\t\ttype: string;\n\t\t\tversion: string;\n\t\t\tdigest: string;\n\t\t}[] = [];\n\n\t\tconst coins: {\n\t\t\tobjectId: string;\n\t\t\ttype: string;\n\t\t\tversion: string;\n\t\t\tdigest: string;\n\t\t}[] = [];\n\n\t\tif (this.#ownedObjects.length === 0 && !this.#hasSui) {\n\t\t\treturn {\n\t\t\t\tbalances,\n\t\t\t\tnfts,\n\t\t\t\tcoins,\n\t\t\t};\n\t\t}\n\n\t\tconst address = new Ed25519Keypair().toHaneulAddress();\n\t\tconst normalizedAddress = normalizeHaneulAddress(address);\n\n\t\tconst tx = this.createClaimTransaction(normalizedAddress);\n\n\t\tif (this.#gasCoin || !this.#hasSui) {\n\t\t\ttx.setGasPayment([]);\n\t\t}\n\n\t\tconst dryRun = await this.#client.dryRunTransactionBlock({\n\t\t\ttransactionBlock: await tx.build({ client: this.#client }),\n\t\t});\n\n\t\tdryRun.balanceChanges.forEach((balanceChange) => {\n\t\t\tif (BigInt(balanceChange.amount) > 0n && isOwner(balanceChange.owner, normalizedAddress)) {\n\t\t\t\tbalances.push({\n\t\t\t\t\tcoinType: normalizeStructTag(balanceChange.coinType),\n\t\t\t\t\tamount: BigInt(balanceChange.amount),\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tdryRun.objectChanges.forEach((objectChange) => {\n\t\t\tif ('objectType' in objectChange) {\n\t\t\t\tconst type = parseStructTag(objectChange.objectType);\n\n\t\t\t\tif (\n\t\t\t\t\ttype.address === normalizeHaneulAddress('0x2') &&\n\t\t\t\t\ttype.module === 'coin' &&\n\t\t\t\t\ttype.name === 'Coin'\n\t\t\t\t) {\n\t\t\t\t\tif (ownedAfterChange(objectChange, normalizedAddress)) {\n\t\t\t\t\t\tcoins.push(objectChange);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ownedAfterChange(objectChange, normalizedAddress)) {\n\t\t\t\tnfts.push(objectChange);\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tbalances,\n\t\t\tnfts,\n\t\t\tcoins,\n\t\t};\n\t}\n\n\t#createNonContractClaimTransaction(address: string) {\n\t\tif (!this.keypair) {\n\t\t\tthrow new Error('Cannot claim assets without the links keypair');\n\t\t}\n\n\t\tconst tx = new Transaction();\n\t\ttx.setSender(this.keypair.toHaneulAddress());\n\n\t\tconst objectsToTransfer: TransactionObjectArgument[] = this.#ownedObjects\n\t\t\t.filter((object) => {\n\t\t\t\tif (this.#gasCoin) {\n\t\t\t\t\tif (object.objectId === this.#gasCoin.coinObjectId) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} else if (object.type === HANEUL_COIN_OBJECT_TYPE) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t})\n\t\t\t.map((object) => tx.object(object.objectId));\n\n\t\tif (this.#gasCoin && this.creatorAddress) {\n\t\t\ttx.transferObjects([tx.gas], this.creatorAddress);\n\t\t} else {\n\t\t\tobjectsToTransfer.push(tx.gas);\n\t\t}\n\n\t\tif (objectsToTransfer.length > 0) {\n\t\t\ttx.transferObjects(objectsToTransfer, address);\n\t\t}\n\n\t\treturn tx;\n\t}\n\n\tasync #loadOwnedObjects({\n\t\tloadClaimedAssets = true,\n\t}: {\n\t\tloadClaimedAssets?: boolean;\n\t} = {}) {\n\t\tthis.assets = {\n\t\t\tnfts: [],\n\t\t\tbalances: [],\n\t\t\tcoins: [],\n\t\t};\n\n\t\tlet nextCursor: string | null | undefined;\n\t\tdo {\n\t\t\tconst ownedObjects = await this.#client.getOwnedObjects({\n\t\t\t\tcursor: nextCursor,\n\t\t\t\towner: this.address,\n\t\t\t\toptions: {\n\t\t\t\t\tshowType: true,\n\t\t\t\t\tshowContent: true,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\t// RPC response returns cursor even if there are no more pages\n\t\t\tnextCursor = ownedObjects.hasNextPage ? ownedObjects.nextCursor : null;\n\t\t\tfor (const object of ownedObjects.data) {\n\t\t\t\tif (object.data) {\n\t\t\t\t\tthis.#ownedObjects.push({\n\t\t\t\t\t\tobjectId: normalizeHaneulObjectId(object.data.objectId),\n\t\t\t\t\t\tversion: object.data.version,\n\t\t\t\t\t\tdigest: object.data.digest,\n\t\t\t\t\t\ttype: normalizeStructTag(object.data.type!),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} while (nextCursor);\n\n\t\tconst coins = await this.#client.getCoins({\n\t\t\tcoinType: HANEUL_COIN_TYPE,\n\t\t\towner: this.address,\n\t\t});\n\n\t\tthis.#hasSui = coins.data.length > 0;\n\t\tthis.#gasCoin = coins.data.find((coin) => BigInt(coin.balance) % 1000n === 987n);\n\n\t\tconst result = await this.#client.queryTransactionBlocks({\n\t\t\tlimit: 1,\n\t\t\torder: 'ascending',\n\t\t\tfilter: {\n\t\t\t\tToAddress: this.address,\n\t\t\t},\n\t\t\toptions: {\n\t\t\t\tshowInput: true,\n\t\t\t\tshowBalanceChanges: true,\n\t\t\t\tshowObjectChanges: true,\n\t\t\t},\n\t\t});\n\n\t\tthis.creatorAddress = result.data[0]?.transaction?.data.sender;\n\n\t\tif (this.#hasSui || this.#ownedObjects.length > 0) {\n\t\t\tthis.claimed = false;\n\t\t\tthis.assets = await this.#listNonContractClaimableAssets();\n\t\t} else if (result.data[0] && loadClaimedAssets) {\n\t\t\tthis.claimed = true;\n\t\t\tawait this.#loadClaimedAssets();\n\t\t}\n\t}\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["bytes", "signature", "tx"]
7
+ }
@@ -0,0 +1,25 @@
1
+ import type { HaneulTransactionBlockResponseOptions } from '@haneullabs/haneul/client';
2
+ import { HaneulClient } from '@haneullabs/haneul/client';
3
+ import { ZkSendLink } from './claim.js';
4
+ import type { ZkBagContractOptions } from './zk-bag.js';
5
+ export declare function getSentTransactionsWithLinks({ address, cursor, limit, network, contract, client, loadAssets, loadClaimedAssets, options, ...linkOptions }: {
6
+ address: string;
7
+ contract?: ZkBagContractOptions;
8
+ cursor?: string;
9
+ limit?: number;
10
+ network?: 'mainnet' | 'testnet';
11
+ loadAssets?: boolean;
12
+ loadClaimedAssets?: boolean;
13
+ host?: string;
14
+ path?: string;
15
+ claimApi?: string;
16
+ client?: HaneulClient;
17
+ options?: HaneulTransactionBlockResponseOptions;
18
+ }): Promise<{
19
+ data: {
20
+ transaction: import("@haneullabs/haneul/client").HaneulTransactionBlockResponse;
21
+ links: ZkSendLink[];
22
+ }[];
23
+ nextCursor: string | null | undefined;
24
+ hasNextPage: boolean;
25
+ }>;
@@ -0,0 +1,114 @@
1
+ import { getFullnodeUrl, HaneulClient } from "@haneullabs/haneul/client";
2
+ import { normalizeHaneulAddress } from "@haneullabs/haneul/utils";
3
+ import { ZkSendLink } from "./claim.js";
4
+ import { getContractIds } from "./zk-bag.js";
5
+ async function getSentTransactionsWithLinks({
6
+ address,
7
+ cursor,
8
+ limit = 10,
9
+ network = "mainnet",
10
+ contract = getContractIds(network),
11
+ client = new HaneulClient({ url: getFullnodeUrl(network) }),
12
+ loadAssets = true,
13
+ loadClaimedAssets = false,
14
+ options,
15
+ ...linkOptions
16
+ }) {
17
+ const packageId = normalizeHaneulAddress(contract.packageId);
18
+ const page = await client.queryTransactionBlocks({
19
+ filter: {
20
+ FromAddress: address
21
+ },
22
+ order: "descending",
23
+ cursor,
24
+ limit,
25
+ options: {
26
+ // Allow these to be explicitly overridden:
27
+ showObjectChanges: loadAssets,
28
+ showBalanceChanges: loadAssets,
29
+ ...options,
30
+ // This is required to do filtering:
31
+ showInput: true
32
+ }
33
+ });
34
+ const data = await Promise.all(
35
+ page.data.map(async (res) => {
36
+ const transaction = res.transaction?.data.transaction;
37
+ if (transaction?.kind !== "ProgrammableTransaction") {
38
+ throw new Error("Invalid transaction");
39
+ }
40
+ const newLinks = await Promise.all(
41
+ transaction.transactions.filter(
42
+ (tx) => "MoveCall" in tx ? tx.MoveCall.package === packageId && tx.MoveCall.module === "zk_bag" && tx.MoveCall.function === "new" : false
43
+ ).map(async (tx) => {
44
+ if (!("MoveCall" in tx)) {
45
+ throw new Error("Expected MoveCall");
46
+ }
47
+ const addressArg = tx.MoveCall.arguments?.[1];
48
+ if (!addressArg || typeof addressArg !== "object" || !("Input" in addressArg)) {
49
+ throw new Error("Invalid address argument");
50
+ }
51
+ const input = transaction.inputs[addressArg.Input];
52
+ if (input.type !== "pure") {
53
+ throw new Error("Expected Address input to be a Pure value");
54
+ }
55
+ const address2 = normalizeHaneulAddress(input.value);
56
+ const link = new ZkSendLink({
57
+ network,
58
+ address: address2,
59
+ contract,
60
+ isContractLink: true,
61
+ client,
62
+ ...linkOptions
63
+ });
64
+ await link.loadAssets({
65
+ transaction: res,
66
+ loadAssets,
67
+ loadClaimedAssets
68
+ });
69
+ return link;
70
+ })
71
+ );
72
+ const regeneratedLinks = await Promise.all(
73
+ transaction.transactions.filter(
74
+ (tx) => "MoveCall" in tx ? tx.MoveCall.package === packageId && tx.MoveCall.module === "zk_bag" && tx.MoveCall.function === "update_receiver" : false
75
+ ).map(async (tx) => {
76
+ if (!("MoveCall" in tx)) {
77
+ throw new Error("Expected MoveCall");
78
+ }
79
+ const addressArg = tx.MoveCall.arguments?.[2];
80
+ if (!addressArg || typeof addressArg !== "object" || !("Input" in addressArg)) {
81
+ throw new Error("Invalid address argument");
82
+ }
83
+ const input = transaction.inputs[addressArg.Input];
84
+ if (input.type !== "pure") {
85
+ throw new Error("Expected Address input to be a Pure value");
86
+ }
87
+ const address2 = normalizeHaneulAddress(input.value);
88
+ const link = new ZkSendLink({
89
+ network,
90
+ address: address2,
91
+ contract,
92
+ isContractLink: true,
93
+ ...linkOptions
94
+ });
95
+ await link.loadAssets({ loadAssets, loadClaimedAssets });
96
+ return link;
97
+ })
98
+ );
99
+ return {
100
+ transaction: res,
101
+ links: [...newLinks, ...regeneratedLinks]
102
+ };
103
+ })
104
+ );
105
+ return {
106
+ data,
107
+ nextCursor: page.nextCursor,
108
+ hasNextPage: page.hasNextPage
109
+ };
110
+ }
111
+ export {
112
+ getSentTransactionsWithLinks
113
+ };
114
+ //# sourceMappingURL=get-sent-transactions.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/links/get-sent-transactions.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { HaneulTransactionBlockResponseOptions } from '@haneullabs/haneul/client';\nimport { getFullnodeUrl, HaneulClient } from '@haneullabs/haneul/client';\nimport { normalizeHaneulAddress } from '@haneullabs/haneul/utils';\n\nimport { ZkSendLink } from './claim.js';\nimport { getContractIds } from './zk-bag.js';\nimport type { ZkBagContractOptions } from './zk-bag.js';\n\nexport async function getSentTransactionsWithLinks({\n\taddress,\n\tcursor,\n\tlimit = 10,\n\tnetwork = 'mainnet',\n\tcontract = getContractIds(network),\n\tclient = new HaneulClient({ url: getFullnodeUrl(network) }),\n\tloadAssets = true,\n\tloadClaimedAssets = false,\n\toptions,\n\t...linkOptions\n}: {\n\taddress: string;\n\tcontract?: ZkBagContractOptions;\n\tcursor?: string;\n\tlimit?: number;\n\tnetwork?: 'mainnet' | 'testnet';\n\tloadAssets?: boolean;\n\tloadClaimedAssets?: boolean;\n\n\t// Link options:\n\thost?: string;\n\tpath?: string;\n\tclaimApi?: string;\n\tclient?: HaneulClient;\n\toptions?: HaneulTransactionBlockResponseOptions;\n}) {\n\tconst packageId = normalizeHaneulAddress(contract.packageId);\n\n\tconst page = await client.queryTransactionBlocks({\n\t\tfilter: {\n\t\t\tFromAddress: address,\n\t\t},\n\t\torder: 'descending',\n\t\tcursor,\n\t\tlimit,\n\t\toptions: {\n\t\t\t// Allow these to be explicitly overridden:\n\t\t\tshowObjectChanges: loadAssets,\n\t\t\tshowBalanceChanges: loadAssets,\n\n\t\t\t...options,\n\n\t\t\t// This is required to do filtering:\n\t\t\tshowInput: true,\n\t\t},\n\t});\n\n\tconst data = await Promise.all(\n\t\tpage.data.map(async (res) => {\n\t\t\tconst transaction = res.transaction?.data.transaction;\n\t\t\tif (transaction?.kind !== 'ProgrammableTransaction') {\n\t\t\t\tthrow new Error('Invalid transaction');\n\t\t\t}\n\n\t\t\tconst newLinks = await Promise.all(\n\t\t\t\ttransaction.transactions\n\t\t\t\t\t.filter((tx) =>\n\t\t\t\t\t\t'MoveCall' in tx\n\t\t\t\t\t\t\t? tx.MoveCall.package === packageId &&\n\t\t\t\t\t\t\t\ttx.MoveCall.module === 'zk_bag' &&\n\t\t\t\t\t\t\t\ttx.MoveCall.function === 'new'\n\t\t\t\t\t\t\t: false,\n\t\t\t\t\t)\n\t\t\t\t\t.map(async (tx) => {\n\t\t\t\t\t\tif (!('MoveCall' in tx)) {\n\t\t\t\t\t\t\tthrow new Error('Expected MoveCall');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst addressArg = tx.MoveCall.arguments?.[1];\n\n\t\t\t\t\t\tif (!addressArg || typeof addressArg !== 'object' || !('Input' in addressArg)) {\n\t\t\t\t\t\t\tthrow new Error('Invalid address argument');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst input = transaction.inputs[addressArg.Input];\n\n\t\t\t\t\t\tif (input.type !== 'pure') {\n\t\t\t\t\t\t\tthrow new Error('Expected Address input to be a Pure value');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst address = normalizeHaneulAddress(input.value as string);\n\n\t\t\t\t\t\tconst link = new ZkSendLink({\n\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\taddress,\n\t\t\t\t\t\t\tcontract,\n\t\t\t\t\t\t\tisContractLink: true,\n\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t...linkOptions,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait link.loadAssets({\n\t\t\t\t\t\t\ttransaction: res,\n\t\t\t\t\t\t\tloadAssets,\n\t\t\t\t\t\t\tloadClaimedAssets,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn link;\n\t\t\t\t\t}),\n\t\t\t);\n\n\t\t\tconst regeneratedLinks = await Promise.all(\n\t\t\t\ttransaction.transactions\n\t\t\t\t\t.filter((tx) =>\n\t\t\t\t\t\t'MoveCall' in tx\n\t\t\t\t\t\t\t? tx.MoveCall.package === packageId &&\n\t\t\t\t\t\t\t\ttx.MoveCall.module === 'zk_bag' &&\n\t\t\t\t\t\t\t\ttx.MoveCall.function === 'update_receiver'\n\t\t\t\t\t\t\t: false,\n\t\t\t\t\t)\n\t\t\t\t\t.map(async (tx) => {\n\t\t\t\t\t\tif (!('MoveCall' in tx)) {\n\t\t\t\t\t\t\tthrow new Error('Expected MoveCall');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst addressArg = tx.MoveCall.arguments?.[2];\n\n\t\t\t\t\t\tif (!addressArg || typeof addressArg !== 'object' || !('Input' in addressArg)) {\n\t\t\t\t\t\t\tthrow new Error('Invalid address argument');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst input = transaction.inputs[addressArg.Input];\n\n\t\t\t\t\t\tif (input.type !== 'pure') {\n\t\t\t\t\t\t\tthrow new Error('Expected Address input to be a Pure value');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst address = normalizeHaneulAddress(input.value as string);\n\n\t\t\t\t\t\tconst link = new ZkSendLink({\n\t\t\t\t\t\t\tnetwork,\n\t\t\t\t\t\t\taddress,\n\t\t\t\t\t\t\tcontract,\n\t\t\t\t\t\t\tisContractLink: true,\n\t\t\t\t\t\t\t...linkOptions,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait link.loadAssets({ loadAssets, loadClaimedAssets });\n\n\t\t\t\t\t\treturn link;\n\t\t\t\t\t}),\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\ttransaction: res,\n\t\t\t\tlinks: [...newLinks, ...regeneratedLinks],\n\t\t\t};\n\t\t}),\n\t);\n\n\treturn {\n\t\tdata,\n\t\tnextCursor: page.nextCursor,\n\t\thasNextPage: page.hasNextPage,\n\t};\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["address"]
7
+ }
@@ -0,0 +1,24 @@
1
+ import type { HaneulClient } from '@haneullabs/haneul/client';
2
+ import { ZkSendLink } from './claim.js';
3
+ import type { ZkBagContractOptions } from './zk-bag.js';
4
+ export declare function listCreatedLinks({ address, cursor, network, contract, fetch: fetchFn, ...linkOptions }: {
5
+ address: string;
6
+ contract?: ZkBagContractOptions;
7
+ cursor?: string;
8
+ network?: 'mainnet' | 'testnet';
9
+ host?: string;
10
+ path?: string;
11
+ claimApi?: string;
12
+ client?: HaneulClient;
13
+ fetch?: typeof fetch;
14
+ }): Promise<{
15
+ cursor: string | null;
16
+ hasNextPage: boolean;
17
+ links: {
18
+ link: ZkSendLink;
19
+ claimed: boolean;
20
+ assets: import("./utils.js").LinkAssets;
21
+ digest: string;
22
+ createdAt: string;
23
+ }[];
24
+ }>;
@@ -0,0 +1,104 @@
1
+ import { bcs } from "@haneullabs/haneul/bcs";
2
+ import { HaneulGraphQLClient } from "@haneullabs/haneul/graphql";
3
+ import { graphql } from "@haneullabs/haneul/graphql/schemas/latest";
4
+ import { fromBase64, normalizeHaneulAddress } from "@haneullabs/haneul/utils";
5
+ import { ZkSendLink } from "./claim.js";
6
+ import { getContractIds } from "./zk-bag.js";
7
+ const ListCreatedLinksQuery = graphql(`
8
+ query listCreatedLinks($address: HaneulAddress!, $function: String!, $cursor: String) {
9
+ transactions(
10
+ last: 10
11
+ before: $cursor
12
+ filter: { sentAddress: $address, function: $function }
13
+ ) {
14
+ pageInfo {
15
+ startCursor
16
+ hasPreviousPage
17
+ }
18
+ nodes {
19
+ effects {
20
+ timestamp
21
+ }
22
+ digest
23
+ transactionBcs
24
+ }
25
+ }
26
+ }
27
+ `);
28
+ async function listCreatedLinks({
29
+ address,
30
+ cursor,
31
+ network,
32
+ contract = getContractIds(network),
33
+ fetch: fetchFn,
34
+ ...linkOptions
35
+ }) {
36
+ const gqlClient = new HaneulGraphQLClient({
37
+ url: network === "testnet" ? "https://graphql.testnet.haneul.io/graphql" : "https://graphql.mainnet.haneul.io/graphql",
38
+ fetch: fetchFn
39
+ });
40
+ const packageId = normalizeHaneulAddress(contract.packageId);
41
+ const page = await gqlClient.query({
42
+ query: ListCreatedLinksQuery,
43
+ variables: {
44
+ address,
45
+ cursor,
46
+ function: `${packageId}::zk_bag::new`
47
+ }
48
+ });
49
+ const transactions = page.data?.transactions;
50
+ if (!transactions || page.errors?.length) {
51
+ throw new Error("Failed to load created links");
52
+ }
53
+ const links = (await Promise.all(
54
+ transactions.nodes.map(async (node) => {
55
+ if (!node.transactionBcs) {
56
+ return null;
57
+ }
58
+ const kind = bcs.TransactionData.parse(fromBase64(node.transactionBcs)).V1.kind;
59
+ if (!kind?.ProgrammableTransaction) {
60
+ return null;
61
+ }
62
+ const { inputs, commands } = kind.ProgrammableTransaction;
63
+ const fn = commands.find(
64
+ (command) => command.MoveCall?.package === packageId && command.MoveCall.module === "zk_bag" && command.MoveCall.function === "new"
65
+ );
66
+ if (!fn?.MoveCall) {
67
+ return null;
68
+ }
69
+ const addressArg = fn.MoveCall.arguments[1];
70
+ if (addressArg.$kind !== "Input") {
71
+ throw new Error("Invalid address argument");
72
+ }
73
+ const input = inputs[addressArg.Input];
74
+ if (!input.Pure) {
75
+ throw new Error("Expected Address input to be a Pure value");
76
+ }
77
+ const address2 = bcs.Address.fromBase64(input.Pure.bytes);
78
+ const link = new ZkSendLink({
79
+ network,
80
+ address: address2,
81
+ contract,
82
+ isContractLink: true,
83
+ ...linkOptions
84
+ });
85
+ await link.loadAssets();
86
+ return {
87
+ link,
88
+ claimed: !!link.claimed,
89
+ assets: link.assets,
90
+ digest: node.digest,
91
+ createdAt: node.effects?.timestamp
92
+ };
93
+ })
94
+ )).reverse();
95
+ return {
96
+ cursor: transactions.pageInfo.startCursor,
97
+ hasNextPage: transactions.pageInfo.hasPreviousPage,
98
+ links: links.filter((link) => link !== null)
99
+ };
100
+ }
101
+ export {
102
+ listCreatedLinks
103
+ };
104
+ //# sourceMappingURL=list-created-links.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/links/list-created-links.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@haneullabs/haneul/bcs';\nimport type { HaneulClient } from '@haneullabs/haneul/client';\nimport { HaneulGraphQLClient } from '@haneullabs/haneul/graphql';\nimport { graphql } from '@haneullabs/haneul/graphql/schemas/latest';\nimport { fromBase64, normalizeHaneulAddress } from '@haneullabs/haneul/utils';\n\nimport { ZkSendLink } from './claim.js';\nimport type { ZkBagContractOptions } from './zk-bag.js';\nimport { getContractIds } from './zk-bag.js';\n\nconst ListCreatedLinksQuery = graphql(`\n\tquery listCreatedLinks($address: HaneulAddress!, $function: String!, $cursor: String) {\n\t\ttransactions(\n\t\t\tlast: 10\n\t\t\tbefore: $cursor\n\t\t\tfilter: { sentAddress: $address, function: $function }\n\t\t) {\n\t\t\tpageInfo {\n\t\t\t\tstartCursor\n\t\t\t\thasPreviousPage\n\t\t\t}\n\t\t\tnodes {\n\t\t\t\teffects {\n\t\t\t\t\ttimestamp\n\t\t\t\t}\n\t\t\t\tdigest\n\t\t\t\ttransactionBcs\n\t\t\t}\n\t\t}\n\t}\n`);\n\nexport async function listCreatedLinks({\n\taddress,\n\tcursor,\n\tnetwork,\n\tcontract = getContractIds(network),\n\tfetch: fetchFn,\n\t...linkOptions\n}: {\n\taddress: string;\n\tcontract?: ZkBagContractOptions;\n\tcursor?: string;\n\tnetwork?: 'mainnet' | 'testnet';\n\n\t// Link options:\n\thost?: string;\n\tpath?: string;\n\tclaimApi?: string;\n\tclient?: HaneulClient;\n\tfetch?: typeof fetch;\n}) {\n\tconst gqlClient = new HaneulGraphQLClient({\n\t\turl:\n\t\t\tnetwork === 'testnet'\n\t\t\t\t? 'https://graphql.testnet.haneul.io/graphql'\n\t\t\t\t: 'https://graphql.mainnet.haneul.io/graphql',\n\t\tfetch: fetchFn,\n\t});\n\n\tconst packageId = normalizeHaneulAddress(contract.packageId);\n\n\tconst page = await gqlClient.query({\n\t\tquery: ListCreatedLinksQuery,\n\t\tvariables: {\n\t\t\taddress,\n\t\t\tcursor,\n\t\t\tfunction: `${packageId}::zk_bag::new`,\n\t\t},\n\t});\n\n\tconst transactions = page.data?.transactions;\n\n\tif (!transactions || page.errors?.length) {\n\t\tthrow new Error('Failed to load created links');\n\t}\n\n\tconst links = (\n\t\tawait Promise.all(\n\t\t\ttransactions.nodes.map(async (node) => {\n\t\t\t\tif (!node.transactionBcs) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tconst kind = bcs.TransactionData.parse(fromBase64(node.transactionBcs)).V1.kind;\n\n\t\t\t\tif (!kind?.ProgrammableTransaction) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tconst { inputs, commands } = kind.ProgrammableTransaction;\n\n\t\t\t\tconst fn = commands.find(\n\t\t\t\t\t(command) =>\n\t\t\t\t\t\tcommand.MoveCall?.package === packageId &&\n\t\t\t\t\t\tcommand.MoveCall.module === 'zk_bag' &&\n\t\t\t\t\t\tcommand.MoveCall.function === 'new',\n\t\t\t\t);\n\n\t\t\t\tif (!fn?.MoveCall) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tconst addressArg = fn.MoveCall.arguments[1];\n\n\t\t\t\tif (addressArg.$kind !== 'Input') {\n\t\t\t\t\tthrow new Error('Invalid address argument');\n\t\t\t\t}\n\n\t\t\t\tconst input = inputs[addressArg.Input];\n\n\t\t\t\tif (!input.Pure) {\n\t\t\t\t\tthrow new Error('Expected Address input to be a Pure value');\n\t\t\t\t}\n\n\t\t\t\tconst address = bcs.Address.fromBase64(input.Pure.bytes);\n\n\t\t\t\tconst link = new ZkSendLink({\n\t\t\t\t\tnetwork,\n\t\t\t\t\taddress,\n\t\t\t\t\tcontract,\n\t\t\t\t\tisContractLink: true,\n\t\t\t\t\t...linkOptions,\n\t\t\t\t});\n\n\t\t\t\tawait link.loadAssets();\n\n\t\t\t\treturn {\n\t\t\t\t\tlink,\n\t\t\t\t\tclaimed: !!link.claimed,\n\t\t\t\t\tassets: link.assets!,\n\t\t\t\t\tdigest: node.digest,\n\t\t\t\t\tcreatedAt: node.effects?.timestamp!,\n\t\t\t\t};\n\t\t\t}),\n\t\t)\n\t).reverse();\n\n\treturn {\n\t\tcursor: transactions.pageInfo.startCursor,\n\t\thasNextPage: transactions.pageInfo.hasPreviousPage,\n\t\tlinks: links.filter((link): link is NonNullable<typeof link> => link !== null),\n\t};\n}\n"],
5
+ "mappings": "AAGA,SAAS,WAAW;AAEpB,SAAS,2BAA2B;AACpC,SAAS,eAAe;AACxB,SAAS,YAAY,8BAA8B;AAEnD,SAAS,kBAAkB;AAE3B,SAAS,sBAAsB;AAE/B,MAAM,wBAAwB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAoBrC;AAED,eAAsB,iBAAiB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW,eAAe,OAAO;AAAA,EACjC,OAAO;AAAA,EACP,GAAG;AACJ,GAYG;AACF,QAAM,YAAY,IAAI,oBAAoB;AAAA,IACzC,KACC,YAAY,YACT,8CACA;AAAA,IACJ,OAAO;AAAA,EACR,CAAC;AAED,QAAM,YAAY,uBAAuB,SAAS,SAAS;AAE3D,QAAM,OAAO,MAAM,UAAU,MAAM;AAAA,IAClC,OAAO;AAAA,IACP,WAAW;AAAA,MACV;AAAA,MACA;AAAA,MACA,UAAU,GAAG,SAAS;AAAA,IACvB;AAAA,EACD,CAAC;AAED,QAAM,eAAe,KAAK,MAAM;AAEhC,MAAI,CAAC,gBAAgB,KAAK,QAAQ,QAAQ;AACzC,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAC/C;AAEA,QAAM,SACL,MAAM,QAAQ;AAAA,IACb,aAAa,MAAM,IAAI,OAAO,SAAS;AACtC,UAAI,CAAC,KAAK,gBAAgB;AACzB,eAAO;AAAA,MACR;AAEA,YAAM,OAAO,IAAI,gBAAgB,MAAM,WAAW,KAAK,cAAc,CAAC,EAAE,GAAG;AAE3E,UAAI,CAAC,MAAM,yBAAyB;AACnC,eAAO;AAAA,MACR;AAEA,YAAM,EAAE,QAAQ,SAAS,IAAI,KAAK;AAElC,YAAM,KAAK,SAAS;AAAA,QACnB,CAAC,YACA,QAAQ,UAAU,YAAY,aAC9B,QAAQ,SAAS,WAAW,YAC5B,QAAQ,SAAS,aAAa;AAAA,MAChC;AAEA,UAAI,CAAC,IAAI,UAAU;AAClB,eAAO;AAAA,MACR;AAEA,YAAM,aAAa,GAAG,SAAS,UAAU,CAAC;AAE1C,UAAI,WAAW,UAAU,SAAS;AACjC,cAAM,IAAI,MAAM,0BAA0B;AAAA,MAC3C;AAEA,YAAM,QAAQ,OAAO,WAAW,KAAK;AAErC,UAAI,CAAC,MAAM,MAAM;AAChB,cAAM,IAAI,MAAM,2CAA2C;AAAA,MAC5D;AAEA,YAAMA,WAAU,IAAI,QAAQ,WAAW,MAAM,KAAK,KAAK;AAEvD,YAAM,OAAO,IAAI,WAAW;AAAA,QAC3B;AAAA,QACA,SAAAA;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,QAChB,GAAG;AAAA,MACJ,CAAC;AAED,YAAM,KAAK,WAAW;AAEtB,aAAO;AAAA,QACN;AAAA,QACA,SAAS,CAAC,CAAC,KAAK;AAAA,QAChB,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,WAAW,KAAK,SAAS;AAAA,MAC1B;AAAA,IACD,CAAC;AAAA,EACF,GACC,QAAQ;AAEV,SAAO;AAAA,IACN,QAAQ,aAAa,SAAS;AAAA,IAC9B,aAAa,aAAa,SAAS;AAAA,IACnC,OAAO,MAAM,OAAO,CAAC,SAA2C,SAAS,IAAI;AAAA,EAC9E;AACD;",
6
+ "names": ["address"]
7
+ }
@@ -0,0 +1,34 @@
1
+ import type { ObjectOwner, HaneulObjectChange, HaneulTransactionBlockResponse } from '@haneullabs/haneul/client';
2
+ import type { Transaction } from '@haneullabs/haneul/transactions';
3
+ export interface LinkAssets {
4
+ balances: {
5
+ coinType: string;
6
+ amount: bigint;
7
+ }[];
8
+ nfts: {
9
+ objectId: string;
10
+ type: string;
11
+ version: string;
12
+ digest: string;
13
+ }[];
14
+ coins: {
15
+ objectId: string;
16
+ type: string;
17
+ version: string;
18
+ digest: string;
19
+ }[];
20
+ }
21
+ export declare function isClaimTransaction(tx: Transaction, options: {
22
+ packageId: string;
23
+ }): boolean;
24
+ export declare function getAssetsFromTransaction({ transaction, address, isSent, }: {
25
+ transaction: HaneulTransactionBlockResponse;
26
+ address: string;
27
+ isSent: boolean;
28
+ }): LinkAssets;
29
+ export declare function ownedAfterChange(objectChange: HaneulObjectChange, address: string): objectChange is Extract<HaneulObjectChange, {
30
+ type: 'created' | 'transferred' | 'mutated';
31
+ }>;
32
+ export declare function isOwner(owner: ObjectOwner, address: string): owner is {
33
+ AddressOwner: string;
34
+ };
@@ -0,0 +1,112 @@
1
+ import { normalizeStructTag, normalizeHaneulAddress, parseStructTag } from "@haneullabs/haneul/utils";
2
+ function isClaimTransaction(tx, options) {
3
+ let transfers = 0;
4
+ for (const command of tx.getData().commands) {
5
+ switch (command.$kind) {
6
+ case "TransferObjects":
7
+ if (!command.TransferObjects.objects.every(
8
+ (o) => o.$kind === "Result" || o.$kind === "NestedResult"
9
+ )) {
10
+ return false;
11
+ }
12
+ transfers++;
13
+ break;
14
+ case "MoveCall":
15
+ if (command.MoveCall.package !== options.packageId) {
16
+ return false;
17
+ }
18
+ if (command.MoveCall.module !== "zk_bag") {
19
+ return false;
20
+ }
21
+ const fn = command.MoveCall.function;
22
+ if (fn !== "init_claim" && fn !== "reclaim" && fn !== "claim" && fn !== "finalize") {
23
+ return false;
24
+ }
25
+ break;
26
+ default:
27
+ return false;
28
+ }
29
+ }
30
+ return transfers === 1;
31
+ }
32
+ function getAssetsFromTransaction({
33
+ transaction,
34
+ address,
35
+ isSent
36
+ }) {
37
+ const normalizedAddress = normalizeHaneulAddress(address);
38
+ const balances = [];
39
+ const nfts = [];
40
+ const coins = [];
41
+ transaction.balanceChanges?.forEach((change) => {
42
+ const validAmountChange = isSent ? BigInt(change.amount) < 0n : BigInt(change.amount) > 0n;
43
+ if (validAmountChange && isOwner(change.owner, normalizedAddress)) {
44
+ balances.push({
45
+ coinType: normalizeStructTag(change.coinType),
46
+ amount: BigInt(change.amount)
47
+ });
48
+ }
49
+ });
50
+ transaction.objectChanges?.forEach((change) => {
51
+ if (!isObjectOwner(change, normalizedAddress, isSent)) {
52
+ return;
53
+ }
54
+ if ("objectType" in change) {
55
+ const type = parseStructTag(change.objectType);
56
+ if (type.address === normalizeHaneulAddress("0x2") && type.module === "coin" && type.name === "Coin") {
57
+ if (change.type === "created" || change.type === "transferred" || change.type === "mutated") {
58
+ coins.push({
59
+ ...change,
60
+ type: change.objectType
61
+ });
62
+ }
63
+ return;
64
+ }
65
+ }
66
+ if (isObjectOwner(change, normalizedAddress, isSent) && (change.type === "created" || change.type === "transferred" || change.type === "mutated")) {
67
+ nfts.push({
68
+ objectId: change.objectId,
69
+ type: change.objectType,
70
+ version: change.version,
71
+ digest: change.digest
72
+ });
73
+ }
74
+ });
75
+ return {
76
+ balances,
77
+ nfts,
78
+ coins
79
+ };
80
+ }
81
+ function getObjectOwnerFromObjectChange(objectChange, isSent) {
82
+ if (isSent) {
83
+ return "owner" in objectChange ? objectChange.owner : null;
84
+ }
85
+ return "recipient" in objectChange ? objectChange.recipient : null;
86
+ }
87
+ function isObjectOwner(objectChange, address, isSent) {
88
+ const owner = getObjectOwnerFromObjectChange(objectChange, isSent);
89
+ if (isSent) {
90
+ return owner && typeof owner === "object" && "AddressOwner" in owner;
91
+ }
92
+ return ownedAfterChange(objectChange, address);
93
+ }
94
+ function ownedAfterChange(objectChange, address) {
95
+ if (objectChange.type === "transferred" && isOwner(objectChange.recipient, address)) {
96
+ return true;
97
+ }
98
+ if ((objectChange.type === "created" || objectChange.type === "mutated") && isOwner(objectChange.owner, address)) {
99
+ return true;
100
+ }
101
+ return false;
102
+ }
103
+ function isOwner(owner, address) {
104
+ return owner && typeof owner === "object" && "AddressOwner" in owner && normalizeHaneulAddress(owner.AddressOwner) === address;
105
+ }
106
+ export {
107
+ getAssetsFromTransaction,
108
+ isClaimTransaction,
109
+ isOwner,
110
+ ownedAfterChange
111
+ };
112
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/links/utils.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ObjectOwner, HaneulObjectChange, HaneulTransactionBlockResponse } from '@haneullabs/haneul/client';\nimport type { Transaction } from '@haneullabs/haneul/transactions';\nimport { normalizeStructTag, normalizeHaneulAddress, parseStructTag } from '@haneullabs/haneul/utils';\n\nexport interface LinkAssets {\n\tbalances: {\n\t\tcoinType: string;\n\t\tamount: bigint;\n\t}[];\n\n\tnfts: {\n\t\tobjectId: string;\n\t\ttype: string;\n\t\tversion: string;\n\t\tdigest: string;\n\t}[];\n\n\tcoins: {\n\t\tobjectId: string;\n\t\ttype: string;\n\t\tversion: string;\n\t\tdigest: string;\n\t}[];\n}\n\nexport function isClaimTransaction(\n\ttx: Transaction,\n\toptions: {\n\t\tpackageId: string;\n\t},\n) {\n\tlet transfers = 0;\n\n\tfor (const command of tx.getData().commands) {\n\t\tswitch (command.$kind) {\n\t\t\tcase 'TransferObjects':\n\t\t\t\t// Ensure that we are only transferring results of a claim\n\t\t\t\tif (\n\t\t\t\t\t!command.TransferObjects.objects.every(\n\t\t\t\t\t\t(o) => o.$kind === 'Result' || o.$kind === 'NestedResult',\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\ttransfers++;\n\t\t\t\tbreak;\n\t\t\tcase 'MoveCall':\n\t\t\t\tif (command.MoveCall.package !== options.packageId) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif (command.MoveCall.module !== 'zk_bag') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tconst fn = command.MoveCall.function;\n\t\t\t\tif (fn !== 'init_claim' && fn !== 'reclaim' && fn !== 'claim' && fn !== 'finalize') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn transfers === 1;\n}\n\nexport function getAssetsFromTransaction({\n\ttransaction,\n\taddress,\n\tisSent,\n}: {\n\ttransaction: HaneulTransactionBlockResponse;\n\taddress: string;\n\tisSent: boolean;\n}): LinkAssets {\n\tconst normalizedAddress = normalizeHaneulAddress(address);\n\tconst balances: {\n\t\tcoinType: string;\n\t\tamount: bigint;\n\t}[] = [];\n\n\tconst nfts: {\n\t\tobjectId: string;\n\t\ttype: string;\n\t\tversion: string;\n\t\tdigest: string;\n\t}[] = [];\n\n\tconst coins: {\n\t\tobjectId: string;\n\t\ttype: string;\n\t\tversion: string;\n\t\tdigest: string;\n\t}[] = [];\n\n\ttransaction.balanceChanges?.forEach((change) => {\n\t\tconst validAmountChange = isSent ? BigInt(change.amount) < 0n : BigInt(change.amount) > 0n;\n\t\tif (validAmountChange && isOwner(change.owner, normalizedAddress)) {\n\t\t\tbalances.push({\n\t\t\t\tcoinType: normalizeStructTag(change.coinType),\n\t\t\t\tamount: BigInt(change.amount),\n\t\t\t});\n\t\t}\n\t});\n\n\ttransaction.objectChanges?.forEach((change) => {\n\t\tif (!isObjectOwner(change, normalizedAddress, isSent)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ('objectType' in change) {\n\t\t\tconst type = parseStructTag(change.objectType);\n\n\t\t\tif (\n\t\t\t\ttype.address === normalizeHaneulAddress('0x2') &&\n\t\t\t\ttype.module === 'coin' &&\n\t\t\t\ttype.name === 'Coin'\n\t\t\t) {\n\t\t\t\tif (\n\t\t\t\t\tchange.type === 'created' ||\n\t\t\t\t\tchange.type === 'transferred' ||\n\t\t\t\t\tchange.type === 'mutated'\n\t\t\t\t) {\n\t\t\t\t\tcoins.push({\n\t\t\t\t\t\t...change,\n\t\t\t\t\t\ttype: change.objectType,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tisObjectOwner(change, normalizedAddress, isSent) &&\n\t\t\t(change.type === 'created' || change.type === 'transferred' || change.type === 'mutated')\n\t\t) {\n\t\t\tnfts.push({\n\t\t\t\tobjectId: change.objectId,\n\t\t\t\ttype: change.objectType,\n\t\t\t\tversion: change.version,\n\t\t\t\tdigest: change.digest,\n\t\t\t});\n\t\t}\n\t});\n\n\treturn {\n\t\tbalances,\n\t\tnfts,\n\t\tcoins,\n\t};\n}\n\nfunction getObjectOwnerFromObjectChange(objectChange: HaneulObjectChange, isSent: boolean) {\n\tif (isSent) {\n\t\treturn 'owner' in objectChange ? objectChange.owner : null;\n\t}\n\n\treturn 'recipient' in objectChange ? objectChange.recipient : null;\n}\n\nfunction isObjectOwner(objectChange: HaneulObjectChange, address: string, isSent: boolean) {\n\tconst owner = getObjectOwnerFromObjectChange(objectChange, isSent);\n\n\tif (isSent) {\n\t\treturn owner && typeof owner === 'object' && 'AddressOwner' in owner;\n\t}\n\n\treturn ownedAfterChange(objectChange, address);\n}\n\nexport function ownedAfterChange(\n\tobjectChange: HaneulObjectChange,\n\taddress: string,\n): objectChange is Extract<HaneulObjectChange, { type: 'created' | 'transferred' | 'mutated' }> {\n\tif (objectChange.type === 'transferred' && isOwner(objectChange.recipient, address)) {\n\t\treturn true;\n\t}\n\n\tif (\n\t\t(objectChange.type === 'created' || objectChange.type === 'mutated') &&\n\t\tisOwner(objectChange.owner, address)\n\t) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nexport function isOwner(owner: ObjectOwner, address: string): owner is { AddressOwner: string } {\n\treturn (\n\t\towner &&\n\t\ttypeof owner === 'object' &&\n\t\t'AddressOwner' in owner &&\n\t\tnormalizeHaneulAddress(owner.AddressOwner) === address\n\t);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,72 @@
1
+ import type { Argument, Transaction, TransactionObjectArgument } from '@haneullabs/haneul/transactions';
2
+ export interface ZkBagContractOptions {
3
+ packageId: string;
4
+ bagStoreId: string;
5
+ bagStoreTableId: string;
6
+ }
7
+ export declare const TESTNET_CONTRACT_IDS: ZkBagContractOptions;
8
+ export declare const MAINNET_CONTRACT_IDS: ZkBagContractOptions;
9
+ export declare function getContractIds(network?: 'mainnet' | 'testnet'): ZkBagContractOptions;
10
+ export declare class ZkBag<IDs> {
11
+ #private;
12
+ ids: IDs;
13
+ constructor(packageAddress: string, ids: IDs);
14
+ new({ arguments: [store, receiver], }: {
15
+ arguments: [store: TransactionObjectArgument | string, receiver: Argument | string];
16
+ }): (tx: Transaction) => void;
17
+ add({ arguments: [store, receiver, item], typeArguments, }: {
18
+ arguments: [
19
+ store: TransactionObjectArgument | string,
20
+ receiver: Argument | string,
21
+ item: TransactionObjectArgument | string
22
+ ];
23
+ typeArguments: [string];
24
+ }): (tx: Transaction) => Extract<Argument, {
25
+ $kind: 'Result';
26
+ }>;
27
+ init_claim({ arguments: [store] }: {
28
+ arguments: [store: TransactionObjectArgument | string];
29
+ }): (tx: Transaction) => readonly [{
30
+ $kind: "NestedResult";
31
+ NestedResult: [number, number];
32
+ }, {
33
+ $kind: "NestedResult";
34
+ NestedResult: [number, number];
35
+ }];
36
+ reclaim({ arguments: [store, receiver], }: {
37
+ arguments: [store: TransactionObjectArgument | string, receiver: Argument | string];
38
+ }): (tx: Transaction) => readonly [{
39
+ $kind: "NestedResult";
40
+ NestedResult: [number, number];
41
+ }, {
42
+ $kind: "NestedResult";
43
+ NestedResult: [number, number];
44
+ }];
45
+ claim({ arguments: [bag, claim, id], typeArguments, }: {
46
+ arguments: [
47
+ bag: TransactionObjectArgument | string,
48
+ claim: Extract<Argument, {
49
+ $kind: 'NestedResult';
50
+ }>,
51
+ id: TransactionObjectArgument | string
52
+ ];
53
+ typeArguments: [string];
54
+ }): (tx: Transaction) => Extract<Argument, {
55
+ $kind: 'Result';
56
+ }>;
57
+ finalize({ arguments: [bag, claim], }: {
58
+ arguments: [
59
+ bag: TransactionObjectArgument | string,
60
+ claim: Extract<Argument, {
61
+ $kind: 'NestedResult';
62
+ }>
63
+ ];
64
+ }): (tx: Transaction) => void;
65
+ update_receiver({ arguments: [bag, from, to], }: {
66
+ arguments: [
67
+ bag: TransactionObjectArgument | string,
68
+ from: Argument | string,
69
+ to: Argument | string
70
+ ];
71
+ }): (tx: Transaction) => void;
72
+ }