{"version":3,"file":"claim.mjs","names":["#client","#claimApi","#network","#host","#path","#contract","#loadBag","#createSponsoredTransaction","#executeSponsoredTransaction","#loadBagObject","#fetch"],"sources":["../../src/links/claim.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@mysten/sui/bcs';\nimport type { Keypair } from '@mysten/sui/cryptography';\nimport { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\nimport {\n\tfromBase64,\n\tnormalizeStructTag,\n\tnormalizeSuiAddress,\n\tparseStructTag,\n\ttoBase64,\n} from '@mysten/sui/utils';\n\nimport type { ZkSendLinkBuilderOptions } from './builder.js';\nimport { ZkSendLinkBuilder } from './builder.js';\nimport type { ClaimedAsset, LinkAssets } from './utils.js';\nimport type { ZkBagContractOptions } from './zk-bag.js';\nimport { getContractIds, ZkBag, ZkBagStruct } from './zk-bag.js';\nimport type { ClientWithCoreApi, SuiClientTypes } from '@mysten/sui/client';\n\nexport const CoinStruct = bcs.struct('Coin', {\n\tid: bcs.Address,\n\tbalance: bcs.u64(),\n});\n\nconst DEFAULT_ZK_SEND_LINK_OPTIONS = {\n\thost: 'https://api.slush.app',\n\tpath: '/claim',\n\tnetwork: 'mainnet' as const,\n};\n\nexport type ZkSendLinkOptions = {\n\tclaimApi?: string;\n\tkeypair?: Keypair;\n\tclient: ClientWithCoreApi;\n\tnetwork?: string;\n\thost?: string;\n\tpath?: string;\n\taddress?: string;\n\tcontract?: ZkBagContractOptions;\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?: SuiClientTypes.GetDynamicFieldResponse['dynamicField'] | null;\n\n\t#client: ClientWithCoreApi;\n\t#contract: ZkBag<ZkBagContractOptions>;\n\t#network: string;\n\t#host: string;\n\t#path: string;\n\t#claimApi: string;\n\n\tconstructor({\n\t\tnetwork = DEFAULT_ZK_SEND_LINK_OPTIONS.network,\n\t\tclient,\n\t\tkeypair,\n\t\tcontract,\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}: ZkSendLinkOptions) {\n\t\tconst resolvedContract = contract ?? getContractIds(network as 'mainnet' | 'testnet');\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!.toSuiAddress();\n\t\tthis.#claimApi = claimApi;\n\t\tthis.#network = network;\n\t\tthis.#host = host;\n\t\tthis.#path = path;\n\n\t\tthis.#contract = new ZkBag(resolvedContract.packageId, resolvedContract);\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\tif (!parsed.hash.startsWith('#$')) {\n\t\t\tthrow new Error('Invalid link URL');\n\t\t}\n\t\tconst parsedNetwork = parsed.searchParams.get('network') === 'testnet' ? 'testnet' : 'mainnet';\n\t\tconst network = options.network ?? parsedNetwork;\n\n\t\tconst keypair = Ed25519Keypair.fromSecretKey(fromBase64(parsed.hash.slice(2)));\n\t\tconst link = new ZkSendLink({\n\t\t\t...options,\n\t\t\tkeypair,\n\t\t\tnetwork,\n\t\t\thost: `${parsed.protocol}//${parsed.host}`,\n\t\t\tpath: parsed.pathname,\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});\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?: SuiClientTypes.TransactionResult;\n\t\t\tloadAssets?: boolean;\n\t\t\tloadClaimedAssets?: boolean;\n\t\t} = {},\n\t) {\n\t\tawait this.#loadBag(options);\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.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!.toSuiAddress(),\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.core.waitForTransaction({\n\t\t\tdigest,\n\t\t\tinclude: {\n\t\t\t\teffects: true,\n\t\t\t},\n\t\t});\n\n\t\tif (result.FailedTransaction) {\n\t\t\tthrow new Error(\n\t\t\t\t`Claim transaction failed: ${result.FailedTransaction.status.error?.message ?? '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\tconst tx = new Transaction();\n\t\ttx.setSender(reclaim ? address : this.keypair!.toSuiAddress());\n\n\t\tconst { init, assets, finalize } = this.claimFlow({ reclaim });\n\t\ttx.add(init);\n\n\t\tif (assets.length > 0) {\n\t\t\ttx.transferObjects(\n\t\t\t\tassets.map((a) => a.argument),\n\t\t\t\taddress,\n\t\t\t);\n\t\t}\n\n\t\ttx.add(finalize);\n\n\t\treturn tx;\n\t}\n\n\tclaimFlow({\n\t\treclaim,\n\t}: {\n\t\treclaim?: boolean;\n\t} = {}) {\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\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 have not been loaded. Call `loadAssets()` or use `ZkSendLink.fromUrl()` / `ZkSendLink.fromAddress()` before calling `claimFlow()`.',\n\t\t\t);\n\t\t}\n\n\t\tconst storeId = this.#contract.ids.bagStoreId;\n\t\tconst initCommand = reclaim\n\t\t\t? this.#contract.reclaim({ arguments: [storeId, this.address] })\n\t\t\t: this.#contract.init_claim({ arguments: [storeId] });\n\n\t\tlet bag: ReturnType<typeof initCommand>[0] | undefined;\n\t\tlet proof: ReturnType<typeof initCommand>[1] | undefined;\n\n\t\tconst init = (tx: Transaction) => {\n\t\t\tconst result = tx.add(initCommand);\n\t\t\t[bag, proof] = result;\n\t\t\treturn result;\n\t\t};\n\n\t\tconst objects = [...this.assets.coins, ...this.assets.nfts];\n\n\t\tconst assets: ClaimedAsset[] = objects.map((object) => ({\n\t\t\ttype: object.type,\n\t\t\tobjectId: object.objectId,\n\t\t\targument: (tx: Transaction) =>\n\t\t\t\ttx.add(\n\t\t\t\t\tthis.#contract.claim({\n\t\t\t\t\t\targuments: [\n\t\t\t\t\t\t\tbag!,\n\t\t\t\t\t\t\tproof!,\n\t\t\t\t\t\t\ttx.receivingRef({\n\t\t\t\t\t\t\t\tobjectId: object.objectId,\n\t\t\t\t\t\t\t\tversion: object.version,\n\t\t\t\t\t\t\t\tdigest: object.digest,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t],\n\t\t\t\t\t\ttypeArguments: [object.type],\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t}));\n\n\t\tconst finalize = (tx: Transaction) => {\n\t\t\ttx.add(this.#contract.finalize({ arguments: [bag!, proof!] }));\n\t\t};\n\n\t\treturn { init, assets, finalize };\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\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\tnetwork: this.#network,\n\t\t\tkeypair: newLinkKp,\n\t\t});\n\n\t\tconst to = tx.pure.address(newLinkKp.toSuiAddress());\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\ttry {\n\t\t\tconst bagField = await this.#client.core.getDynamicField({\n\t\t\t\tparentId: this.#contract.ids.bagStoreTableId,\n\t\t\t\tname: {\n\t\t\t\t\ttype: 'address',\n\t\t\t\t\tbcs: bcs.Address.serialize(this.address).toBytes(),\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tthis.bagObject = bagField.dynamicField;\n\n\t\t\tif (this.bagObject) {\n\t\t\t\tthis.claimed = false;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Dynamic field not found - bag either doesn't exist or has been claimed\n\t\t\tthis.bagObject = null;\n\t\t\tthis.claimed = true;\n\t\t}\n\t}\n\n\tasync #loadBag({\n\t\tloadAssets = true,\n\t}: {\n\t\tloadAssets?: boolean;\n\t} = {}) {\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\treturn;\n\t\t}\n\n\t\tconst itemIds = ZkBagStruct.parse(this.bagObject?.value.bcs).item_ids;\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.core.getObjects({\n\t\t\tobjectIds: itemIds,\n\t\t\tinclude: {\n\t\t\t\tcontent: 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.objects.forEach((object, i) => {\n\t\t\tif (object instanceof Error) {\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.type));\n\n\t\t\tif (\n\t\t\t\ttype.address === normalizeSuiAddress('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.objectId,\n\t\t\t\t\ttype: object.type,\n\t\t\t\t\tversion: object.version,\n\t\t\t\t\tdigest: object.digest,\n\t\t\t\t});\n\n\t\t\t\tconst amount = BigInt(CoinStruct.parse(object.content).balance);\n\t\t\t\tconst coinType = normalizeStructTag(parseStructTag(object.type).typeParams[0]);\n\t\t\t\tif (!balances.has(coinType)) {\n\t\t\t\t\tbalances.set(coinType, { coinType, amount });\n\t\t\t\t} else {\n\t\t\t\t\tbalances.get(coinType)!.amount += amount;\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.objectId,\n\t\t\t\t\ttype: object.type,\n\t\t\t\t\tversion: object.version,\n\t\t\t\t\tdigest: object.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 #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"],"mappings":"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"}