@algorandfoundation/algokit-utils 10.0.0-alpha.29 → 10.0.0-alpha.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -1
- package/packages/transact/src/multisig.js +1 -1
- package/packages/transact/src/multisig.js.map +1 -1
- package/packages/transact/src/multisig.mjs +1 -1
- package/packages/transact/src/multisig.mjs.map +1 -1
- package/types/algorand-client-transaction-creator.d.ts +10 -10
- package/types/algorand-client-transaction-sender.d.ts +10 -10
- package/types/app-client.d.ts +10 -10
- package/types/app-factory.d.ts +8 -8
package/package.json
CHANGED
|
@@ -6,11 +6,15 @@
|
|
|
6
6
|
"**"
|
|
7
7
|
],
|
|
8
8
|
"name": "@algorandfoundation/algokit-utils",
|
|
9
|
-
"version": "10.0.0-alpha.
|
|
9
|
+
"version": "10.0.0-alpha.31",
|
|
10
10
|
"private": false,
|
|
11
11
|
"description": "A set of core Algorand utilities written in TypeScript and released via npm that make it easier to build solutions on Algorand.",
|
|
12
12
|
"author": "Algorand Foundation",
|
|
13
13
|
"license": "MIT",
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "https://github.com/algorandfoundation/algokit-utils-ts.git"
|
|
17
|
+
},
|
|
14
18
|
"engines": {
|
|
15
19
|
"node": ">=20.0"
|
|
16
20
|
},
|
|
@@ -323,7 +323,7 @@ var MultisigAccount = class MultisigAccount {
|
|
|
323
323
|
createMultisigSignature() {
|
|
324
324
|
const subsignatures = toPublicKeys(this._params.addrs).map((pk) => ({
|
|
325
325
|
publicKey: pk,
|
|
326
|
-
|
|
326
|
+
sig: void 0
|
|
327
327
|
}));
|
|
328
328
|
return {
|
|
329
329
|
version: this._params.version,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multisig.js","names":["getAddress","arrayEqual","msig: MultisigSignature","authAddress: Address | undefined","Address","newSubsigs: MultisigSubsignature[]","SIGNATURE_BYTE_LENGTH","ALGORAND_ADDRESS_BYTE_LENGTH","ALGORAND_CHECKSUM_BYTE_LENGTH","PUBLIC_KEY_BYTE_LENGTH","hash","multisigAddress: typeof addressFromMultisigPreImgAddrs","signedMsigTxns: SignedTransaction[]","decodeSignedTransaction","encodeSignedTransaction","subsignatures: MultisigSubsignature[]"],"sources":["../../../../packages/transact/src/multisig.ts"],"sourcesContent":["import {\n Address,\n ALGORAND_ADDRESS_BYTE_LENGTH,\n ALGORAND_CHECKSUM_BYTE_LENGTH,\n arrayEqual,\n getAddress,\n hash,\n PUBLIC_KEY_BYTE_LENGTH,\n SIGNATURE_BYTE_LENGTH,\n} from '@algorandfoundation/algokit-common'\nimport { DelegatedLsigSigner } from './logicsig'\nimport { AddressWithDelegatedLsigSigner, AddressWithTransactionSigner, TransactionSigner } from './signer'\nimport {\n decodeSignedTransaction,\n encodeSignedTransaction,\n MultisigSignature,\n MultisigSubsignature,\n SignedTransaction,\n validateSignedTransaction,\n} from './transactions/signed-transaction'\nimport { Transaction } from './transactions/transaction'\n\nconst toPublicKeys = (addrs: Array<string | Address>): Uint8Array[] => addrs.map((addr) => getAddress(addr).publicKey)\n\n/**\n * Applies a subsignature for a participant to a multisignature signature, replacing any existing signature.\n *\n * This method applies the signature to ALL instances of the given public key (to support weighted multisig).\n * Since ed25519 signatures are deterministic, there's only one valid signature for a given message and public key.\n */\nfunction applyMultisigSubsignature(\n multisigSignature: MultisigSignature,\n participant: Uint8Array,\n signature: Uint8Array,\n): MultisigSignature {\n let found = false\n const newSubsignatures = multisigSignature.subsigs.map((subsig) => {\n if (arrayEqual(subsig.publicKey, participant)) {\n found = true\n return { ...subsig, sig: signature } satisfies MultisigSubsignature\n }\n return subsig\n })\n\n if (!found) {\n throw new Error('Public key not found in multisig signature')\n }\n\n return {\n ...multisigSignature,\n subsigs: newSubsignatures,\n }\n}\n\n// Convert \"MultisigAddr\" UTF-8 to byte array\nconst MULTISIG_PREIMG2ADDR_PREFIX = new Uint8Array([77, 117, 108, 116, 105, 115, 105, 103, 65, 100, 100, 114])\n\nconst INVALID_MSIG_VERSION_ERROR_MSG = 'invalid multisig version'\nconst INVALID_MSIG_THRESHOLD_ERROR_MSG = 'bad multisig threshold'\nconst INVALID_MSIG_PK_ERROR_MSG = 'bad multisig public key - wrong length'\nconst UNEXPECTED_PK_LEN_ERROR_MSG = 'nacl public key length is not 32 bytes'\n\nconst MULTISIG_MERGE_LESSTHANTWO_ERROR_MSG = 'Not enough multisig transactions to merge. Need at least two'\nconst MULTISIG_MERGE_MISMATCH_ERROR_MSG = 'Cannot merge txs. txIDs differ'\nconst MULTISIG_MERGE_MISMATCH_AUTH_ADDR_MSG = 'Cannot merge txs. Auth addrs differ'\nconst MULTISIG_MERGE_WRONG_PREIMAGE_ERROR_MSG = 'Cannot merge txs. Multisig preimages differ'\nconst MULTISIG_MERGE_SIG_MISMATCH_ERROR_MSG = 'Cannot merge txs. subsigs are mismatched.'\nconst MULTISIG_SIGNATURE_LENGTH_ERROR_MSG = 'Cannot add multisig signature. Signature is not of the correct length.'\nconst MULTISIG_KEY_NOT_EXIST_ERROR_MSG = 'Key does not exist'\n\n/**\n * creates a raw, multisig transaction blob without any signatures.\n * @param txn - the actual transaction.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param pks - ordered list of public keys in this multisig\n * @returns encoded multisig blob\n */\nfunction createMultisigTransaction(txn: Transaction, { version, threshold, addrs }: MultisigMetadata) {\n // construct the appendable multisigned transaction format\n const pks = toPublicKeys(addrs)\n const subsignatures = pks.map(\n (pk) =>\n ({\n publicKey: pk,\n sig: undefined,\n }) satisfies MultisigSubsignature,\n )\n\n const msig: MultisigSignature = {\n version,\n threshold,\n subsigs: subsignatures,\n }\n\n // if the address of this multisig is different from the transaction sender,\n // we need to add the auth-addr field\n const msigAddr = addressFromMultisigPreImg({\n version,\n threshold,\n publicKeys: pks,\n })\n let authAddress: Address | undefined\n if (!msigAddr.equals(txn.sender)) {\n authAddress = msigAddr\n }\n\n const signedTxn: SignedTransaction = {\n txn: txn,\n msig: msig,\n authAddress,\n }\n\n return signedTxn\n}\n\ninterface MultisigOptions {\n rawSig: Uint8Array\n myPk: Uint8Array\n}\n\ninterface MultisigMetadataWithPublicKeys extends Omit<MultisigMetadata, 'addrs'> {\n publicKeys: Uint8Array[]\n}\n\n/**\n * creates a multisig transaction blob with an included signature.\n * @param txn - the actual transaction to sign.\n * @param rawSig - a Uint8Array raw signature of that transaction\n * @param myPk - a public key that corresponds with rawSig\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param pks - ordered list of public keys in this multisig\n * @returns encoded multisig blob\n */\nfunction createMultisigTransactionWithSignature(\n txn: Transaction,\n { rawSig, myPk }: MultisigOptions,\n { version, threshold, publicKeys }: MultisigMetadataWithPublicKeys,\n): SignedTransaction {\n // Create an empty encoded multisig transaction\n const signedTxn = createMultisigTransaction(txn, {\n version,\n threshold,\n addrs: publicKeys.map((pk) => new Address(pk)),\n })\n\n let keyExist = false\n\n // append the multisig signature to the corresponding public key in the multisig blob\n const updatedSubsigs = signedTxn.msig!.subsigs.map((subsig) => {\n if (arrayEqual(subsig.publicKey, myPk)) {\n keyExist = true\n return { ...subsig, sig: rawSig }\n }\n return subsig\n })\n\n if (!keyExist) {\n throw new Error(MULTISIG_KEY_NOT_EXIST_ERROR_MSG)\n }\n\n const updatedSignedTxn: SignedTransaction = {\n ...signedTxn,\n msig: {\n ...signedTxn.msig!,\n subsigs: updatedSubsigs,\n },\n }\n\n return updatedSignedTxn\n}\n\n/**\n * takes a list of multisig transaction blobs, and merges them.\n * @param multisigTxnBlobs - a list of blobs representing encoded multisig txns\n * @returns typed array msg-pack encoded multisig txn\n */\nfunction mergeMultisigTransactions(multisigTxnBlobs: SignedTransaction[]): SignedTransaction {\n if (multisigTxnBlobs.length < 2) {\n throw new Error(MULTISIG_MERGE_LESSTHANTWO_ERROR_MSG)\n }\n const refSigTx = multisigTxnBlobs[0]\n if (!refSigTx.msig) {\n throw new Error('Invalid multisig transaction, multisig structure missing at index 0')\n }\n const refTxID = refSigTx.txn.txId()\n const refAuthAddr = refSigTx.authAddress\n const refPreImage = {\n version: refSigTx.msig.version,\n threshold: refSigTx.msig.threshold,\n publicKeys: refSigTx.msig.subsigs.map((subsig) => subsig.publicKey),\n }\n const refMsigAddr = addressFromMultisigPreImg(refPreImage)\n\n const newSubsigs: MultisigSubsignature[] = refSigTx.msig.subsigs.map((sig) => ({ ...sig }))\n for (let i = 1; i < multisigTxnBlobs.length; i++) {\n const unisig = multisigTxnBlobs[i]\n if (!unisig.msig) {\n throw new Error(`Invalid multisig transaction, multisig structure missing at index ${i}`)\n }\n\n if (unisig.txn.txId() !== refTxID) {\n throw new Error(MULTISIG_MERGE_MISMATCH_ERROR_MSG)\n }\n\n const authAddr = unisig.authAddress\n if (refAuthAddr !== authAddr) {\n throw new Error(MULTISIG_MERGE_MISMATCH_AUTH_ADDR_MSG)\n }\n\n // check multisig has same preimage as reference\n if (unisig.msig.subsigs.length !== refSigTx.msig.subsigs.length) {\n throw new Error(MULTISIG_MERGE_WRONG_PREIMAGE_ERROR_MSG)\n }\n const preimg: MultisigMetadataWithPublicKeys = {\n version: unisig.msig.version,\n threshold: unisig.msig.threshold,\n publicKeys: unisig.msig.subsigs.map((subsig) => subsig.publicKey),\n }\n const msgigAddr = addressFromMultisigPreImg(preimg)\n if (refMsigAddr.toString() !== msgigAddr.toString()) {\n throw new Error(MULTISIG_MERGE_WRONG_PREIMAGE_ERROR_MSG)\n }\n\n // now, we can merge\n unisig.msig.subsigs.forEach((uniSubsig, index) => {\n if (!uniSubsig.sig) return\n const current = newSubsigs[index]\n if (current.sig && !arrayEqual(uniSubsig.sig, current.sig)) {\n // mismatch\n throw new Error(MULTISIG_MERGE_SIG_MISMATCH_ERROR_MSG)\n }\n current.sig = uniSubsig.sig\n })\n }\n\n const msig: MultisigSignature = {\n version: refSigTx.msig.version,\n threshold: refSigTx.msig.threshold,\n subsigs: newSubsigs,\n }\n\n const signedTxn: SignedTransaction = {\n txn: refSigTx.txn,\n msig: msig,\n authAddress: refAuthAddr,\n }\n\n return signedTxn\n}\n\n/**\n * Partially signs this transaction with an external raw multisig signature and returns\n * a partially-signed multisig transaction, encoded with msgpack as a typed array.\n * @param transaction - The transaction to sign\n * @param metadata - multisig metadata\n * @param signerAddr - address of the signer\n * @param signature - raw multisig signature\n * @returns an encoded, partially signed multisig transaction.\n */\nfunction partialSignWithMultisigSignature(\n transaction: Transaction,\n metadata: MultisigMetadataWithPublicKeys,\n signerAddr: string | Address,\n signature: Uint8Array,\n) {\n if (signature.length != SIGNATURE_BYTE_LENGTH) {\n throw new Error(MULTISIG_SIGNATURE_LENGTH_ERROR_MSG)\n }\n const signerAddressObj = typeof signerAddr === 'string' ? Address.fromString(signerAddr) : signerAddr\n return createMultisigTransactionWithSignature(\n transaction,\n {\n rawSig: signature,\n myPk: signerAddressObj.publicKey,\n },\n metadata,\n )\n}\n\n/**\n * Takes a multisig transaction blob, and appends a given raw signature to it.\n * This makes it possible to compile a multisig signature using only raw signatures from external methods.\n * @param multisigTxnBlob - an encoded multisig txn. Supports non-payment txn types.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param addrs - a list of Algorand addresses representing possible signers for this multisig. Order is important.\n * @param signerAddr - address of the signer\n * @param signature - raw multisig signature\n * @returns object containing txID, and blob representing encoded multisig txn\n */\nfunction appendSignRawMultisigSignature(\n multisigTxn: SignedTransaction,\n { version, threshold, addrs }: MultisigMetadata,\n signerAddr: string | Address,\n signature: Uint8Array,\n): SignedTransaction {\n const publicKeys = toPublicKeys(addrs)\n // obtain underlying txn, sign it, and merge it\n const partialSigned = partialSignWithMultisigSignature(multisigTxn.txn, { version, threshold, publicKeys }, signerAddr, signature)\n return mergeMultisigTransactions([multisigTxn, partialSigned])\n}\n\n/**\n * Takes multisig parameters and returns a 32 byte typed array public key,\n * representing an address that identifies the \"exact group, version, and public keys\" that are required for signing.\n * Hash(\"MultisigAddr\" || version uint8 || threshold uint8 || PK1 || PK2 || ...)\n * Encoding this output yields a human readable address.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param pks - array of typed array public keys\n */\nfunction addressFromMultisigPreImg({\n version,\n threshold,\n publicKeys,\n}: Omit<MultisigMetadata, 'addrs'> & {\n publicKeys: Uint8Array[]\n}): Address {\n if (version > 255 || version < 0) {\n // ^ a tad redundant, but in case in the future version != 1, still check for uint8\n throw new Error(`${INVALID_MSIG_VERSION_ERROR_MSG}: ${version}`)\n }\n if (threshold === 0 || publicKeys.length === 0 || threshold > publicKeys.length || threshold > 255) {\n throw new Error(INVALID_MSIG_THRESHOLD_ERROR_MSG)\n }\n const pkLen = ALGORAND_ADDRESS_BYTE_LENGTH - ALGORAND_CHECKSUM_BYTE_LENGTH\n if (pkLen !== PUBLIC_KEY_BYTE_LENGTH) {\n throw new Error(UNEXPECTED_PK_LEN_ERROR_MSG)\n }\n const merged = new Uint8Array(MULTISIG_PREIMG2ADDR_PREFIX.length + 2 + pkLen * publicKeys.length)\n merged.set(MULTISIG_PREIMG2ADDR_PREFIX, 0)\n merged.set([version], MULTISIG_PREIMG2ADDR_PREFIX.length)\n merged.set([threshold], MULTISIG_PREIMG2ADDR_PREFIX.length + 1)\n for (let i = 0; i < publicKeys.length; i++) {\n if (publicKeys[i].length !== pkLen) {\n throw new Error(INVALID_MSIG_PK_ERROR_MSG)\n }\n merged.set(publicKeys[i], MULTISIG_PREIMG2ADDR_PREFIX.length + 2 + i * pkLen)\n }\n return new Address(Uint8Array.from(hash(merged)))\n}\n\n/**\n * Takes multisig parameters and returns a human readable Algorand address.\n * This is equivalent to fromMultisigPreImg, but interfaces with encoded addresses.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param addrs - array of encoded addresses\n */\nfunction addressFromMultisigPreImgAddrs({ version, threshold, addrs }: MultisigMetadata): Address {\n return addressFromMultisigPreImg({\n version,\n threshold,\n publicKeys: toPublicKeys(addrs),\n })\n}\n\n/**\n * Takes multisig metadata (preimage) and returns the corresponding human readable Algorand address.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param addrs - list of Algorand addresses\n */\nconst multisigAddress: typeof addressFromMultisigPreImgAddrs = addressFromMultisigPreImgAddrs\n\nexport interface MultisigMetadata {\n /**\n * Multisig version\n */\n version: number\n\n /**\n * Multisig threshold value. Authorization requires a subset of signatures,\n * equal to or greater than the threshold value.\n */\n threshold: number\n\n /**\n * A list of Algorand addresses representing possible signers for this multisig. Order is important.\n */\n addrs: Array<Address>\n}\n\n/** Account wrapper that supports partial or full multisig signing. */\nexport class MultisigAccount implements AddressWithTransactionSigner, AddressWithDelegatedLsigSigner {\n _params: MultisigMetadata\n _subSigners: (AddressWithTransactionSigner & AddressWithDelegatedLsigSigner)[]\n _addr: Address\n _signer: TransactionSigner\n _lsigSigner: DelegatedLsigSigner\n\n /** The parameters for the multisig account */\n get params(): Readonly<MultisigMetadata> {\n return this._params\n }\n\n /** The list of accounts that are present to sign transactions or lsigs */\n get subSigners() {\n return this._subSigners\n }\n\n /** The address of the multisig account */\n get addr(): Readonly<Address> {\n return this._addr\n }\n\n /** The transaction signer for the multisig account */\n get signer(): TransactionSigner {\n return this._signer\n }\n\n get lsigSigner(): DelegatedLsigSigner {\n return this._lsigSigner\n }\n\n static fromSignature(signature: MultisigSignature): MultisigAccount {\n const params: MultisigMetadata = {\n version: signature.version,\n threshold: signature.threshold,\n addrs: signature.subsigs.map((subsig) => new Address(subsig.publicKey)),\n }\n\n return new MultisigAccount(params, [])\n }\n\n constructor(multisigParams: MultisigMetadata, subSigners: (AddressWithTransactionSigner & AddressWithDelegatedLsigSigner)[]) {\n this._params = multisigParams\n this._subSigners = subSigners\n this._addr = multisigAddress(multisigParams)\n this._signer = async (txns: Transaction[], indexesToSign: number[]): Promise<Uint8Array[]> => {\n const txnsToSign = txns.filter((_, index) => indexesToSign.includes(index))\n const signedMsigTxns: SignedTransaction[] = []\n\n for (const txn of txnsToSign) {\n let signedMsigTxn = createMultisigTransaction(txn, this._params)\n\n for (const subSigner of this.subSigners) {\n const stxn = (await subSigner.signer([txn], [0]))[0]\n const sig = decodeSignedTransaction(stxn).sig\n\n if (!sig) {\n throw new Error(\n `Signer for address ${subSigner.addr.toString()} did not produce a valid signature when signing ${txn.txId()} for multisig account ${this._addr.toString()}`,\n )\n }\n\n signedMsigTxn = appendSignRawMultisigSignature(signedMsigTxn, this._params, subSigner.addr, sig)\n }\n\n signedMsigTxns.push(signedMsigTxn)\n }\n\n return signedMsigTxns.map((stxn) => {\n validateSignedTransaction(stxn)\n return encodeSignedTransaction(stxn)\n })\n }\n\n this._lsigSigner = async (lsig, _) => {\n let lmsig = lsig.lmsig ?? this.createMultisigSignature()\n\n for (const addrWithSigner of this.subSigners) {\n const { lsigSigner, addr } = addrWithSigner\n const result = await lsigSigner(lsig, this)\n if (!('sig' in result) || !result.sig) {\n throw new Error(\n `Signer for address ${addr.toString()} did not produce a valid signature when signing logic sig for multisig account ${this._addr.toString()}`,\n )\n }\n\n lmsig = this.applySignature(lmsig, addr.publicKey, result.sig)\n }\n\n return { addr: this.addr, lmsig }\n }\n }\n\n createMultisigTransaction(txn: Transaction): SignedTransaction {\n return createMultisigTransaction(txn, this._params)\n }\n\n createMultisigSignature(): MultisigSignature {\n const pks = toPublicKeys(this._params.addrs)\n const subsignatures: MultisigSubsignature[] = pks.map((pk) => ({\n publicKey: pk,\n signature: undefined,\n }))\n\n return {\n version: this._params.version,\n threshold: this._params.threshold,\n subsigs: subsignatures,\n }\n }\n\n applySignatureToTxn(txn: SignedTransaction, pubkey: Uint8Array, signature: Uint8Array): void {\n if (!txn.msig) {\n const createdTxn = this.createMultisigTransaction(txn.txn)\n txn.msig = createdTxn.msig\n }\n\n txn.msig = applyMultisigSubsignature(txn.msig!, pubkey, signature)\n }\n\n applySignature(msigSignature: MultisigSignature, pubkey: Uint8Array, signature: Uint8Array): MultisigSignature {\n if (msigSignature.version !== this._params.version || msigSignature.threshold !== this._params.threshold) {\n const thisParams = {\n version: this._params.version,\n threshold: this._params.threshold,\n participants: this._params.addrs.map((addr) => addr.toString()),\n }\n\n const givenParams = {\n version: msigSignature.version,\n threshold: msigSignature.threshold,\n participants: msigSignature.subsigs.map((subsig) => new Address(subsig.publicKey).toString()),\n }\n\n throw new Error(\n `Multisig signature parameters do not match expected multisig parameters. Multisig params: ${JSON.stringify(thisParams)}, signature: ${JSON.stringify(givenParams)}`,\n )\n }\n\n return applyMultisigSubsignature(msigSignature, pubkey, signature)\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"multisig.js","names":["getAddress","arrayEqual","msig: MultisigSignature","authAddress: Address | undefined","Address","newSubsigs: MultisigSubsignature[]","SIGNATURE_BYTE_LENGTH","ALGORAND_ADDRESS_BYTE_LENGTH","ALGORAND_CHECKSUM_BYTE_LENGTH","PUBLIC_KEY_BYTE_LENGTH","hash","multisigAddress: typeof addressFromMultisigPreImgAddrs","signedMsigTxns: SignedTransaction[]","decodeSignedTransaction","encodeSignedTransaction","subsignatures: MultisigSubsignature[]"],"sources":["../../../../packages/transact/src/multisig.ts"],"sourcesContent":["import {\n Address,\n ALGORAND_ADDRESS_BYTE_LENGTH,\n ALGORAND_CHECKSUM_BYTE_LENGTH,\n arrayEqual,\n getAddress,\n hash,\n PUBLIC_KEY_BYTE_LENGTH,\n SIGNATURE_BYTE_LENGTH,\n} from '@algorandfoundation/algokit-common'\nimport { DelegatedLsigSigner } from './logicsig'\nimport { AddressWithDelegatedLsigSigner, AddressWithTransactionSigner, TransactionSigner } from './signer'\nimport {\n decodeSignedTransaction,\n encodeSignedTransaction,\n MultisigSignature,\n MultisigSubsignature,\n SignedTransaction,\n validateSignedTransaction,\n} from './transactions/signed-transaction'\nimport { Transaction } from './transactions/transaction'\n\nconst toPublicKeys = (addrs: Array<string | Address>): Uint8Array[] => addrs.map((addr) => getAddress(addr).publicKey)\n\n/**\n * Applies a subsignature for a participant to a multisignature signature, replacing any existing signature.\n *\n * This method applies the signature to ALL instances of the given public key (to support weighted multisig).\n * Since ed25519 signatures are deterministic, there's only one valid signature for a given message and public key.\n */\nfunction applyMultisigSubsignature(\n multisigSignature: MultisigSignature,\n participant: Uint8Array,\n signature: Uint8Array,\n): MultisigSignature {\n let found = false\n const newSubsignatures = multisigSignature.subsigs.map((subsig) => {\n if (arrayEqual(subsig.publicKey, participant)) {\n found = true\n return { ...subsig, sig: signature } satisfies MultisigSubsignature\n }\n return subsig\n })\n\n if (!found) {\n throw new Error('Public key not found in multisig signature')\n }\n\n return {\n ...multisigSignature,\n subsigs: newSubsignatures,\n }\n}\n\n// Convert \"MultisigAddr\" UTF-8 to byte array\nconst MULTISIG_PREIMG2ADDR_PREFIX = new Uint8Array([77, 117, 108, 116, 105, 115, 105, 103, 65, 100, 100, 114])\n\nconst INVALID_MSIG_VERSION_ERROR_MSG = 'invalid multisig version'\nconst INVALID_MSIG_THRESHOLD_ERROR_MSG = 'bad multisig threshold'\nconst INVALID_MSIG_PK_ERROR_MSG = 'bad multisig public key - wrong length'\nconst UNEXPECTED_PK_LEN_ERROR_MSG = 'nacl public key length is not 32 bytes'\n\nconst MULTISIG_MERGE_LESSTHANTWO_ERROR_MSG = 'Not enough multisig transactions to merge. Need at least two'\nconst MULTISIG_MERGE_MISMATCH_ERROR_MSG = 'Cannot merge txs. txIDs differ'\nconst MULTISIG_MERGE_MISMATCH_AUTH_ADDR_MSG = 'Cannot merge txs. Auth addrs differ'\nconst MULTISIG_MERGE_WRONG_PREIMAGE_ERROR_MSG = 'Cannot merge txs. Multisig preimages differ'\nconst MULTISIG_MERGE_SIG_MISMATCH_ERROR_MSG = 'Cannot merge txs. subsigs are mismatched.'\nconst MULTISIG_SIGNATURE_LENGTH_ERROR_MSG = 'Cannot add multisig signature. Signature is not of the correct length.'\nconst MULTISIG_KEY_NOT_EXIST_ERROR_MSG = 'Key does not exist'\n\n/**\n * creates a raw, multisig transaction blob without any signatures.\n * @param txn - the actual transaction.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param pks - ordered list of public keys in this multisig\n * @returns encoded multisig blob\n */\nfunction createMultisigTransaction(txn: Transaction, { version, threshold, addrs }: MultisigMetadata) {\n // construct the appendable multisigned transaction format\n const pks = toPublicKeys(addrs)\n const subsignatures = pks.map(\n (pk) =>\n ({\n publicKey: pk,\n sig: undefined,\n }) satisfies MultisigSubsignature,\n )\n\n const msig: MultisigSignature = {\n version,\n threshold,\n subsigs: subsignatures,\n }\n\n // if the address of this multisig is different from the transaction sender,\n // we need to add the auth-addr field\n const msigAddr = addressFromMultisigPreImg({\n version,\n threshold,\n publicKeys: pks,\n })\n let authAddress: Address | undefined\n if (!msigAddr.equals(txn.sender)) {\n authAddress = msigAddr\n }\n\n const signedTxn: SignedTransaction = {\n txn: txn,\n msig: msig,\n authAddress,\n }\n\n return signedTxn\n}\n\ninterface MultisigOptions {\n rawSig: Uint8Array\n myPk: Uint8Array\n}\n\ninterface MultisigMetadataWithPublicKeys extends Omit<MultisigMetadata, 'addrs'> {\n publicKeys: Uint8Array[]\n}\n\n/**\n * creates a multisig transaction blob with an included signature.\n * @param txn - the actual transaction to sign.\n * @param rawSig - a Uint8Array raw signature of that transaction\n * @param myPk - a public key that corresponds with rawSig\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param pks - ordered list of public keys in this multisig\n * @returns encoded multisig blob\n */\nfunction createMultisigTransactionWithSignature(\n txn: Transaction,\n { rawSig, myPk }: MultisigOptions,\n { version, threshold, publicKeys }: MultisigMetadataWithPublicKeys,\n): SignedTransaction {\n // Create an empty encoded multisig transaction\n const signedTxn = createMultisigTransaction(txn, {\n version,\n threshold,\n addrs: publicKeys.map((pk) => new Address(pk)),\n })\n\n let keyExist = false\n\n // append the multisig signature to the corresponding public key in the multisig blob\n const updatedSubsigs = signedTxn.msig!.subsigs.map((subsig) => {\n if (arrayEqual(subsig.publicKey, myPk)) {\n keyExist = true\n return { ...subsig, sig: rawSig }\n }\n return subsig\n })\n\n if (!keyExist) {\n throw new Error(MULTISIG_KEY_NOT_EXIST_ERROR_MSG)\n }\n\n const updatedSignedTxn: SignedTransaction = {\n ...signedTxn,\n msig: {\n ...signedTxn.msig!,\n subsigs: updatedSubsigs,\n },\n }\n\n return updatedSignedTxn\n}\n\n/**\n * takes a list of multisig transaction blobs, and merges them.\n * @param multisigTxnBlobs - a list of blobs representing encoded multisig txns\n * @returns typed array msg-pack encoded multisig txn\n */\nfunction mergeMultisigTransactions(multisigTxnBlobs: SignedTransaction[]): SignedTransaction {\n if (multisigTxnBlobs.length < 2) {\n throw new Error(MULTISIG_MERGE_LESSTHANTWO_ERROR_MSG)\n }\n const refSigTx = multisigTxnBlobs[0]\n if (!refSigTx.msig) {\n throw new Error('Invalid multisig transaction, multisig structure missing at index 0')\n }\n const refTxID = refSigTx.txn.txId()\n const refAuthAddr = refSigTx.authAddress\n const refPreImage = {\n version: refSigTx.msig.version,\n threshold: refSigTx.msig.threshold,\n publicKeys: refSigTx.msig.subsigs.map((subsig) => subsig.publicKey),\n }\n const refMsigAddr = addressFromMultisigPreImg(refPreImage)\n\n const newSubsigs: MultisigSubsignature[] = refSigTx.msig.subsigs.map((sig) => ({ ...sig }))\n for (let i = 1; i < multisigTxnBlobs.length; i++) {\n const unisig = multisigTxnBlobs[i]\n if (!unisig.msig) {\n throw new Error(`Invalid multisig transaction, multisig structure missing at index ${i}`)\n }\n\n if (unisig.txn.txId() !== refTxID) {\n throw new Error(MULTISIG_MERGE_MISMATCH_ERROR_MSG)\n }\n\n const authAddr = unisig.authAddress\n if (refAuthAddr !== authAddr) {\n throw new Error(MULTISIG_MERGE_MISMATCH_AUTH_ADDR_MSG)\n }\n\n // check multisig has same preimage as reference\n if (unisig.msig.subsigs.length !== refSigTx.msig.subsigs.length) {\n throw new Error(MULTISIG_MERGE_WRONG_PREIMAGE_ERROR_MSG)\n }\n const preimg: MultisigMetadataWithPublicKeys = {\n version: unisig.msig.version,\n threshold: unisig.msig.threshold,\n publicKeys: unisig.msig.subsigs.map((subsig) => subsig.publicKey),\n }\n const msgigAddr = addressFromMultisigPreImg(preimg)\n if (refMsigAddr.toString() !== msgigAddr.toString()) {\n throw new Error(MULTISIG_MERGE_WRONG_PREIMAGE_ERROR_MSG)\n }\n\n // now, we can merge\n unisig.msig.subsigs.forEach((uniSubsig, index) => {\n if (!uniSubsig.sig) return\n const current = newSubsigs[index]\n if (current.sig && !arrayEqual(uniSubsig.sig, current.sig)) {\n // mismatch\n throw new Error(MULTISIG_MERGE_SIG_MISMATCH_ERROR_MSG)\n }\n current.sig = uniSubsig.sig\n })\n }\n\n const msig: MultisigSignature = {\n version: refSigTx.msig.version,\n threshold: refSigTx.msig.threshold,\n subsigs: newSubsigs,\n }\n\n const signedTxn: SignedTransaction = {\n txn: refSigTx.txn,\n msig: msig,\n authAddress: refAuthAddr,\n }\n\n return signedTxn\n}\n\n/**\n * Partially signs this transaction with an external raw multisig signature and returns\n * a partially-signed multisig transaction, encoded with msgpack as a typed array.\n * @param transaction - The transaction to sign\n * @param metadata - multisig metadata\n * @param signerAddr - address of the signer\n * @param signature - raw multisig signature\n * @returns an encoded, partially signed multisig transaction.\n */\nfunction partialSignWithMultisigSignature(\n transaction: Transaction,\n metadata: MultisigMetadataWithPublicKeys,\n signerAddr: string | Address,\n signature: Uint8Array,\n) {\n if (signature.length != SIGNATURE_BYTE_LENGTH) {\n throw new Error(MULTISIG_SIGNATURE_LENGTH_ERROR_MSG)\n }\n const signerAddressObj = typeof signerAddr === 'string' ? Address.fromString(signerAddr) : signerAddr\n return createMultisigTransactionWithSignature(\n transaction,\n {\n rawSig: signature,\n myPk: signerAddressObj.publicKey,\n },\n metadata,\n )\n}\n\n/**\n * Takes a multisig transaction blob, and appends a given raw signature to it.\n * This makes it possible to compile a multisig signature using only raw signatures from external methods.\n * @param multisigTxnBlob - an encoded multisig txn. Supports non-payment txn types.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param addrs - a list of Algorand addresses representing possible signers for this multisig. Order is important.\n * @param signerAddr - address of the signer\n * @param signature - raw multisig signature\n * @returns object containing txID, and blob representing encoded multisig txn\n */\nfunction appendSignRawMultisigSignature(\n multisigTxn: SignedTransaction,\n { version, threshold, addrs }: MultisigMetadata,\n signerAddr: string | Address,\n signature: Uint8Array,\n): SignedTransaction {\n const publicKeys = toPublicKeys(addrs)\n // obtain underlying txn, sign it, and merge it\n const partialSigned = partialSignWithMultisigSignature(multisigTxn.txn, { version, threshold, publicKeys }, signerAddr, signature)\n return mergeMultisigTransactions([multisigTxn, partialSigned])\n}\n\n/**\n * Takes multisig parameters and returns a 32 byte typed array public key,\n * representing an address that identifies the \"exact group, version, and public keys\" that are required for signing.\n * Hash(\"MultisigAddr\" || version uint8 || threshold uint8 || PK1 || PK2 || ...)\n * Encoding this output yields a human readable address.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param pks - array of typed array public keys\n */\nfunction addressFromMultisigPreImg({\n version,\n threshold,\n publicKeys,\n}: Omit<MultisigMetadata, 'addrs'> & {\n publicKeys: Uint8Array[]\n}): Address {\n if (version > 255 || version < 0) {\n // ^ a tad redundant, but in case in the future version != 1, still check for uint8\n throw new Error(`${INVALID_MSIG_VERSION_ERROR_MSG}: ${version}`)\n }\n if (threshold === 0 || publicKeys.length === 0 || threshold > publicKeys.length || threshold > 255) {\n throw new Error(INVALID_MSIG_THRESHOLD_ERROR_MSG)\n }\n const pkLen = ALGORAND_ADDRESS_BYTE_LENGTH - ALGORAND_CHECKSUM_BYTE_LENGTH\n if (pkLen !== PUBLIC_KEY_BYTE_LENGTH) {\n throw new Error(UNEXPECTED_PK_LEN_ERROR_MSG)\n }\n const merged = new Uint8Array(MULTISIG_PREIMG2ADDR_PREFIX.length + 2 + pkLen * publicKeys.length)\n merged.set(MULTISIG_PREIMG2ADDR_PREFIX, 0)\n merged.set([version], MULTISIG_PREIMG2ADDR_PREFIX.length)\n merged.set([threshold], MULTISIG_PREIMG2ADDR_PREFIX.length + 1)\n for (let i = 0; i < publicKeys.length; i++) {\n if (publicKeys[i].length !== pkLen) {\n throw new Error(INVALID_MSIG_PK_ERROR_MSG)\n }\n merged.set(publicKeys[i], MULTISIG_PREIMG2ADDR_PREFIX.length + 2 + i * pkLen)\n }\n return new Address(Uint8Array.from(hash(merged)))\n}\n\n/**\n * Takes multisig parameters and returns a human readable Algorand address.\n * This is equivalent to fromMultisigPreImg, but interfaces with encoded addresses.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param addrs - array of encoded addresses\n */\nfunction addressFromMultisigPreImgAddrs({ version, threshold, addrs }: MultisigMetadata): Address {\n return addressFromMultisigPreImg({\n version,\n threshold,\n publicKeys: toPublicKeys(addrs),\n })\n}\n\n/**\n * Takes multisig metadata (preimage) and returns the corresponding human readable Algorand address.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param addrs - list of Algorand addresses\n */\nconst multisigAddress: typeof addressFromMultisigPreImgAddrs = addressFromMultisigPreImgAddrs\n\nexport interface MultisigMetadata {\n /**\n * Multisig version\n */\n version: number\n\n /**\n * Multisig threshold value. Authorization requires a subset of signatures,\n * equal to or greater than the threshold value.\n */\n threshold: number\n\n /**\n * A list of Algorand addresses representing possible signers for this multisig. Order is important.\n */\n addrs: Array<Address>\n}\n\n/** Account wrapper that supports partial or full multisig signing. */\nexport class MultisigAccount implements AddressWithTransactionSigner, AddressWithDelegatedLsigSigner {\n _params: MultisigMetadata\n _subSigners: (AddressWithTransactionSigner & AddressWithDelegatedLsigSigner)[]\n _addr: Address\n _signer: TransactionSigner\n _lsigSigner: DelegatedLsigSigner\n\n /** The parameters for the multisig account */\n get params(): Readonly<MultisigMetadata> {\n return this._params\n }\n\n /** The list of accounts that are present to sign transactions or lsigs */\n get subSigners() {\n return this._subSigners\n }\n\n /** The address of the multisig account */\n get addr(): Readonly<Address> {\n return this._addr\n }\n\n /** The transaction signer for the multisig account */\n get signer(): TransactionSigner {\n return this._signer\n }\n\n get lsigSigner(): DelegatedLsigSigner {\n return this._lsigSigner\n }\n\n static fromSignature(signature: MultisigSignature): MultisigAccount {\n const params: MultisigMetadata = {\n version: signature.version,\n threshold: signature.threshold,\n addrs: signature.subsigs.map((subsig) => new Address(subsig.publicKey)),\n }\n\n return new MultisigAccount(params, [])\n }\n\n constructor(multisigParams: MultisigMetadata, subSigners: (AddressWithTransactionSigner & AddressWithDelegatedLsigSigner)[]) {\n this._params = multisigParams\n this._subSigners = subSigners\n this._addr = multisigAddress(multisigParams)\n this._signer = async (txns: Transaction[], indexesToSign: number[]): Promise<Uint8Array[]> => {\n const txnsToSign = txns.filter((_, index) => indexesToSign.includes(index))\n const signedMsigTxns: SignedTransaction[] = []\n\n for (const txn of txnsToSign) {\n let signedMsigTxn = createMultisigTransaction(txn, this._params)\n\n for (const subSigner of this.subSigners) {\n const stxn = (await subSigner.signer([txn], [0]))[0]\n const sig = decodeSignedTransaction(stxn).sig\n\n if (!sig) {\n throw new Error(\n `Signer for address ${subSigner.addr.toString()} did not produce a valid signature when signing ${txn.txId()} for multisig account ${this._addr.toString()}`,\n )\n }\n\n signedMsigTxn = appendSignRawMultisigSignature(signedMsigTxn, this._params, subSigner.addr, sig)\n }\n\n signedMsigTxns.push(signedMsigTxn)\n }\n\n return signedMsigTxns.map((stxn) => {\n validateSignedTransaction(stxn)\n return encodeSignedTransaction(stxn)\n })\n }\n\n this._lsigSigner = async (lsig, _) => {\n let lmsig = lsig.lmsig ?? this.createMultisigSignature()\n\n for (const addrWithSigner of this.subSigners) {\n const { lsigSigner, addr } = addrWithSigner\n const result = await lsigSigner(lsig, this)\n if (!('sig' in result) || !result.sig) {\n throw new Error(\n `Signer for address ${addr.toString()} did not produce a valid signature when signing logic sig for multisig account ${this._addr.toString()}`,\n )\n }\n\n lmsig = this.applySignature(lmsig, addr.publicKey, result.sig)\n }\n\n return { addr: this.addr, lmsig }\n }\n }\n\n createMultisigTransaction(txn: Transaction): SignedTransaction {\n return createMultisigTransaction(txn, this._params)\n }\n\n createMultisigSignature(): MultisigSignature {\n const pks = toPublicKeys(this._params.addrs)\n const subsignatures: MultisigSubsignature[] = pks.map((pk) => ({\n publicKey: pk,\n sig: undefined,\n }))\n\n return {\n version: this._params.version,\n threshold: this._params.threshold,\n subsigs: subsignatures,\n }\n }\n\n applySignatureToTxn(txn: SignedTransaction, pubkey: Uint8Array, signature: Uint8Array): void {\n if (!txn.msig) {\n const createdTxn = this.createMultisigTransaction(txn.txn)\n txn.msig = createdTxn.msig\n }\n\n txn.msig = applyMultisigSubsignature(txn.msig!, pubkey, signature)\n }\n\n applySignature(msigSignature: MultisigSignature, pubkey: Uint8Array, signature: Uint8Array): MultisigSignature {\n if (msigSignature.version !== this._params.version || msigSignature.threshold !== this._params.threshold) {\n const thisParams = {\n version: this._params.version,\n threshold: this._params.threshold,\n participants: this._params.addrs.map((addr) => addr.toString()),\n }\n\n const givenParams = {\n version: msigSignature.version,\n threshold: msigSignature.threshold,\n participants: msigSignature.subsigs.map((subsig) => new Address(subsig.publicKey).toString()),\n }\n\n throw new Error(\n `Multisig signature parameters do not match expected multisig parameters. Multisig params: ${JSON.stringify(thisParams)}, signature: ${JSON.stringify(givenParams)}`,\n )\n }\n\n return applyMultisigSubsignature(msigSignature, pubkey, signature)\n }\n}\n"],"mappings":"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"}
|
|
@@ -323,7 +323,7 @@ var MultisigAccount = class MultisigAccount {
|
|
|
323
323
|
createMultisigSignature() {
|
|
324
324
|
const subsignatures = toPublicKeys(this._params.addrs).map((pk) => ({
|
|
325
325
|
publicKey: pk,
|
|
326
|
-
|
|
326
|
+
sig: void 0
|
|
327
327
|
}));
|
|
328
328
|
return {
|
|
329
329
|
version: this._params.version,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multisig.mjs","names":["msig: MultisigSignature","authAddress: Address | undefined","newSubsigs: MultisigSubsignature[]","multisigAddress: typeof addressFromMultisigPreImgAddrs","signedMsigTxns: SignedTransaction[]","subsignatures: MultisigSubsignature[]"],"sources":["../../../../packages/transact/src/multisig.ts"],"sourcesContent":["import {\n Address,\n ALGORAND_ADDRESS_BYTE_LENGTH,\n ALGORAND_CHECKSUM_BYTE_LENGTH,\n arrayEqual,\n getAddress,\n hash,\n PUBLIC_KEY_BYTE_LENGTH,\n SIGNATURE_BYTE_LENGTH,\n} from '@algorandfoundation/algokit-common'\nimport { DelegatedLsigSigner } from './logicsig'\nimport { AddressWithDelegatedLsigSigner, AddressWithTransactionSigner, TransactionSigner } from './signer'\nimport {\n decodeSignedTransaction,\n encodeSignedTransaction,\n MultisigSignature,\n MultisigSubsignature,\n SignedTransaction,\n validateSignedTransaction,\n} from './transactions/signed-transaction'\nimport { Transaction } from './transactions/transaction'\n\nconst toPublicKeys = (addrs: Array<string | Address>): Uint8Array[] => addrs.map((addr) => getAddress(addr).publicKey)\n\n/**\n * Applies a subsignature for a participant to a multisignature signature, replacing any existing signature.\n *\n * This method applies the signature to ALL instances of the given public key (to support weighted multisig).\n * Since ed25519 signatures are deterministic, there's only one valid signature for a given message and public key.\n */\nfunction applyMultisigSubsignature(\n multisigSignature: MultisigSignature,\n participant: Uint8Array,\n signature: Uint8Array,\n): MultisigSignature {\n let found = false\n const newSubsignatures = multisigSignature.subsigs.map((subsig) => {\n if (arrayEqual(subsig.publicKey, participant)) {\n found = true\n return { ...subsig, sig: signature } satisfies MultisigSubsignature\n }\n return subsig\n })\n\n if (!found) {\n throw new Error('Public key not found in multisig signature')\n }\n\n return {\n ...multisigSignature,\n subsigs: newSubsignatures,\n }\n}\n\n// Convert \"MultisigAddr\" UTF-8 to byte array\nconst MULTISIG_PREIMG2ADDR_PREFIX = new Uint8Array([77, 117, 108, 116, 105, 115, 105, 103, 65, 100, 100, 114])\n\nconst INVALID_MSIG_VERSION_ERROR_MSG = 'invalid multisig version'\nconst INVALID_MSIG_THRESHOLD_ERROR_MSG = 'bad multisig threshold'\nconst INVALID_MSIG_PK_ERROR_MSG = 'bad multisig public key - wrong length'\nconst UNEXPECTED_PK_LEN_ERROR_MSG = 'nacl public key length is not 32 bytes'\n\nconst MULTISIG_MERGE_LESSTHANTWO_ERROR_MSG = 'Not enough multisig transactions to merge. Need at least two'\nconst MULTISIG_MERGE_MISMATCH_ERROR_MSG = 'Cannot merge txs. txIDs differ'\nconst MULTISIG_MERGE_MISMATCH_AUTH_ADDR_MSG = 'Cannot merge txs. Auth addrs differ'\nconst MULTISIG_MERGE_WRONG_PREIMAGE_ERROR_MSG = 'Cannot merge txs. Multisig preimages differ'\nconst MULTISIG_MERGE_SIG_MISMATCH_ERROR_MSG = 'Cannot merge txs. subsigs are mismatched.'\nconst MULTISIG_SIGNATURE_LENGTH_ERROR_MSG = 'Cannot add multisig signature. Signature is not of the correct length.'\nconst MULTISIG_KEY_NOT_EXIST_ERROR_MSG = 'Key does not exist'\n\n/**\n * creates a raw, multisig transaction blob without any signatures.\n * @param txn - the actual transaction.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param pks - ordered list of public keys in this multisig\n * @returns encoded multisig blob\n */\nfunction createMultisigTransaction(txn: Transaction, { version, threshold, addrs }: MultisigMetadata) {\n // construct the appendable multisigned transaction format\n const pks = toPublicKeys(addrs)\n const subsignatures = pks.map(\n (pk) =>\n ({\n publicKey: pk,\n sig: undefined,\n }) satisfies MultisigSubsignature,\n )\n\n const msig: MultisigSignature = {\n version,\n threshold,\n subsigs: subsignatures,\n }\n\n // if the address of this multisig is different from the transaction sender,\n // we need to add the auth-addr field\n const msigAddr = addressFromMultisigPreImg({\n version,\n threshold,\n publicKeys: pks,\n })\n let authAddress: Address | undefined\n if (!msigAddr.equals(txn.sender)) {\n authAddress = msigAddr\n }\n\n const signedTxn: SignedTransaction = {\n txn: txn,\n msig: msig,\n authAddress,\n }\n\n return signedTxn\n}\n\ninterface MultisigOptions {\n rawSig: Uint8Array\n myPk: Uint8Array\n}\n\ninterface MultisigMetadataWithPublicKeys extends Omit<MultisigMetadata, 'addrs'> {\n publicKeys: Uint8Array[]\n}\n\n/**\n * creates a multisig transaction blob with an included signature.\n * @param txn - the actual transaction to sign.\n * @param rawSig - a Uint8Array raw signature of that transaction\n * @param myPk - a public key that corresponds with rawSig\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param pks - ordered list of public keys in this multisig\n * @returns encoded multisig blob\n */\nfunction createMultisigTransactionWithSignature(\n txn: Transaction,\n { rawSig, myPk }: MultisigOptions,\n { version, threshold, publicKeys }: MultisigMetadataWithPublicKeys,\n): SignedTransaction {\n // Create an empty encoded multisig transaction\n const signedTxn = createMultisigTransaction(txn, {\n version,\n threshold,\n addrs: publicKeys.map((pk) => new Address(pk)),\n })\n\n let keyExist = false\n\n // append the multisig signature to the corresponding public key in the multisig blob\n const updatedSubsigs = signedTxn.msig!.subsigs.map((subsig) => {\n if (arrayEqual(subsig.publicKey, myPk)) {\n keyExist = true\n return { ...subsig, sig: rawSig }\n }\n return subsig\n })\n\n if (!keyExist) {\n throw new Error(MULTISIG_KEY_NOT_EXIST_ERROR_MSG)\n }\n\n const updatedSignedTxn: SignedTransaction = {\n ...signedTxn,\n msig: {\n ...signedTxn.msig!,\n subsigs: updatedSubsigs,\n },\n }\n\n return updatedSignedTxn\n}\n\n/**\n * takes a list of multisig transaction blobs, and merges them.\n * @param multisigTxnBlobs - a list of blobs representing encoded multisig txns\n * @returns typed array msg-pack encoded multisig txn\n */\nfunction mergeMultisigTransactions(multisigTxnBlobs: SignedTransaction[]): SignedTransaction {\n if (multisigTxnBlobs.length < 2) {\n throw new Error(MULTISIG_MERGE_LESSTHANTWO_ERROR_MSG)\n }\n const refSigTx = multisigTxnBlobs[0]\n if (!refSigTx.msig) {\n throw new Error('Invalid multisig transaction, multisig structure missing at index 0')\n }\n const refTxID = refSigTx.txn.txId()\n const refAuthAddr = refSigTx.authAddress\n const refPreImage = {\n version: refSigTx.msig.version,\n threshold: refSigTx.msig.threshold,\n publicKeys: refSigTx.msig.subsigs.map((subsig) => subsig.publicKey),\n }\n const refMsigAddr = addressFromMultisigPreImg(refPreImage)\n\n const newSubsigs: MultisigSubsignature[] = refSigTx.msig.subsigs.map((sig) => ({ ...sig }))\n for (let i = 1; i < multisigTxnBlobs.length; i++) {\n const unisig = multisigTxnBlobs[i]\n if (!unisig.msig) {\n throw new Error(`Invalid multisig transaction, multisig structure missing at index ${i}`)\n }\n\n if (unisig.txn.txId() !== refTxID) {\n throw new Error(MULTISIG_MERGE_MISMATCH_ERROR_MSG)\n }\n\n const authAddr = unisig.authAddress\n if (refAuthAddr !== authAddr) {\n throw new Error(MULTISIG_MERGE_MISMATCH_AUTH_ADDR_MSG)\n }\n\n // check multisig has same preimage as reference\n if (unisig.msig.subsigs.length !== refSigTx.msig.subsigs.length) {\n throw new Error(MULTISIG_MERGE_WRONG_PREIMAGE_ERROR_MSG)\n }\n const preimg: MultisigMetadataWithPublicKeys = {\n version: unisig.msig.version,\n threshold: unisig.msig.threshold,\n publicKeys: unisig.msig.subsigs.map((subsig) => subsig.publicKey),\n }\n const msgigAddr = addressFromMultisigPreImg(preimg)\n if (refMsigAddr.toString() !== msgigAddr.toString()) {\n throw new Error(MULTISIG_MERGE_WRONG_PREIMAGE_ERROR_MSG)\n }\n\n // now, we can merge\n unisig.msig.subsigs.forEach((uniSubsig, index) => {\n if (!uniSubsig.sig) return\n const current = newSubsigs[index]\n if (current.sig && !arrayEqual(uniSubsig.sig, current.sig)) {\n // mismatch\n throw new Error(MULTISIG_MERGE_SIG_MISMATCH_ERROR_MSG)\n }\n current.sig = uniSubsig.sig\n })\n }\n\n const msig: MultisigSignature = {\n version: refSigTx.msig.version,\n threshold: refSigTx.msig.threshold,\n subsigs: newSubsigs,\n }\n\n const signedTxn: SignedTransaction = {\n txn: refSigTx.txn,\n msig: msig,\n authAddress: refAuthAddr,\n }\n\n return signedTxn\n}\n\n/**\n * Partially signs this transaction with an external raw multisig signature and returns\n * a partially-signed multisig transaction, encoded with msgpack as a typed array.\n * @param transaction - The transaction to sign\n * @param metadata - multisig metadata\n * @param signerAddr - address of the signer\n * @param signature - raw multisig signature\n * @returns an encoded, partially signed multisig transaction.\n */\nfunction partialSignWithMultisigSignature(\n transaction: Transaction,\n metadata: MultisigMetadataWithPublicKeys,\n signerAddr: string | Address,\n signature: Uint8Array,\n) {\n if (signature.length != SIGNATURE_BYTE_LENGTH) {\n throw new Error(MULTISIG_SIGNATURE_LENGTH_ERROR_MSG)\n }\n const signerAddressObj = typeof signerAddr === 'string' ? Address.fromString(signerAddr) : signerAddr\n return createMultisigTransactionWithSignature(\n transaction,\n {\n rawSig: signature,\n myPk: signerAddressObj.publicKey,\n },\n metadata,\n )\n}\n\n/**\n * Takes a multisig transaction blob, and appends a given raw signature to it.\n * This makes it possible to compile a multisig signature using only raw signatures from external methods.\n * @param multisigTxnBlob - an encoded multisig txn. Supports non-payment txn types.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param addrs - a list of Algorand addresses representing possible signers for this multisig. Order is important.\n * @param signerAddr - address of the signer\n * @param signature - raw multisig signature\n * @returns object containing txID, and blob representing encoded multisig txn\n */\nfunction appendSignRawMultisigSignature(\n multisigTxn: SignedTransaction,\n { version, threshold, addrs }: MultisigMetadata,\n signerAddr: string | Address,\n signature: Uint8Array,\n): SignedTransaction {\n const publicKeys = toPublicKeys(addrs)\n // obtain underlying txn, sign it, and merge it\n const partialSigned = partialSignWithMultisigSignature(multisigTxn.txn, { version, threshold, publicKeys }, signerAddr, signature)\n return mergeMultisigTransactions([multisigTxn, partialSigned])\n}\n\n/**\n * Takes multisig parameters and returns a 32 byte typed array public key,\n * representing an address that identifies the \"exact group, version, and public keys\" that are required for signing.\n * Hash(\"MultisigAddr\" || version uint8 || threshold uint8 || PK1 || PK2 || ...)\n * Encoding this output yields a human readable address.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param pks - array of typed array public keys\n */\nfunction addressFromMultisigPreImg({\n version,\n threshold,\n publicKeys,\n}: Omit<MultisigMetadata, 'addrs'> & {\n publicKeys: Uint8Array[]\n}): Address {\n if (version > 255 || version < 0) {\n // ^ a tad redundant, but in case in the future version != 1, still check for uint8\n throw new Error(`${INVALID_MSIG_VERSION_ERROR_MSG}: ${version}`)\n }\n if (threshold === 0 || publicKeys.length === 0 || threshold > publicKeys.length || threshold > 255) {\n throw new Error(INVALID_MSIG_THRESHOLD_ERROR_MSG)\n }\n const pkLen = ALGORAND_ADDRESS_BYTE_LENGTH - ALGORAND_CHECKSUM_BYTE_LENGTH\n if (pkLen !== PUBLIC_KEY_BYTE_LENGTH) {\n throw new Error(UNEXPECTED_PK_LEN_ERROR_MSG)\n }\n const merged = new Uint8Array(MULTISIG_PREIMG2ADDR_PREFIX.length + 2 + pkLen * publicKeys.length)\n merged.set(MULTISIG_PREIMG2ADDR_PREFIX, 0)\n merged.set([version], MULTISIG_PREIMG2ADDR_PREFIX.length)\n merged.set([threshold], MULTISIG_PREIMG2ADDR_PREFIX.length + 1)\n for (let i = 0; i < publicKeys.length; i++) {\n if (publicKeys[i].length !== pkLen) {\n throw new Error(INVALID_MSIG_PK_ERROR_MSG)\n }\n merged.set(publicKeys[i], MULTISIG_PREIMG2ADDR_PREFIX.length + 2 + i * pkLen)\n }\n return new Address(Uint8Array.from(hash(merged)))\n}\n\n/**\n * Takes multisig parameters and returns a human readable Algorand address.\n * This is equivalent to fromMultisigPreImg, but interfaces with encoded addresses.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param addrs - array of encoded addresses\n */\nfunction addressFromMultisigPreImgAddrs({ version, threshold, addrs }: MultisigMetadata): Address {\n return addressFromMultisigPreImg({\n version,\n threshold,\n publicKeys: toPublicKeys(addrs),\n })\n}\n\n/**\n * Takes multisig metadata (preimage) and returns the corresponding human readable Algorand address.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param addrs - list of Algorand addresses\n */\nconst multisigAddress: typeof addressFromMultisigPreImgAddrs = addressFromMultisigPreImgAddrs\n\nexport interface MultisigMetadata {\n /**\n * Multisig version\n */\n version: number\n\n /**\n * Multisig threshold value. Authorization requires a subset of signatures,\n * equal to or greater than the threshold value.\n */\n threshold: number\n\n /**\n * A list of Algorand addresses representing possible signers for this multisig. Order is important.\n */\n addrs: Array<Address>\n}\n\n/** Account wrapper that supports partial or full multisig signing. */\nexport class MultisigAccount implements AddressWithTransactionSigner, AddressWithDelegatedLsigSigner {\n _params: MultisigMetadata\n _subSigners: (AddressWithTransactionSigner & AddressWithDelegatedLsigSigner)[]\n _addr: Address\n _signer: TransactionSigner\n _lsigSigner: DelegatedLsigSigner\n\n /** The parameters for the multisig account */\n get params(): Readonly<MultisigMetadata> {\n return this._params\n }\n\n /** The list of accounts that are present to sign transactions or lsigs */\n get subSigners() {\n return this._subSigners\n }\n\n /** The address of the multisig account */\n get addr(): Readonly<Address> {\n return this._addr\n }\n\n /** The transaction signer for the multisig account */\n get signer(): TransactionSigner {\n return this._signer\n }\n\n get lsigSigner(): DelegatedLsigSigner {\n return this._lsigSigner\n }\n\n static fromSignature(signature: MultisigSignature): MultisigAccount {\n const params: MultisigMetadata = {\n version: signature.version,\n threshold: signature.threshold,\n addrs: signature.subsigs.map((subsig) => new Address(subsig.publicKey)),\n }\n\n return new MultisigAccount(params, [])\n }\n\n constructor(multisigParams: MultisigMetadata, subSigners: (AddressWithTransactionSigner & AddressWithDelegatedLsigSigner)[]) {\n this._params = multisigParams\n this._subSigners = subSigners\n this._addr = multisigAddress(multisigParams)\n this._signer = async (txns: Transaction[], indexesToSign: number[]): Promise<Uint8Array[]> => {\n const txnsToSign = txns.filter((_, index) => indexesToSign.includes(index))\n const signedMsigTxns: SignedTransaction[] = []\n\n for (const txn of txnsToSign) {\n let signedMsigTxn = createMultisigTransaction(txn, this._params)\n\n for (const subSigner of this.subSigners) {\n const stxn = (await subSigner.signer([txn], [0]))[0]\n const sig = decodeSignedTransaction(stxn).sig\n\n if (!sig) {\n throw new Error(\n `Signer for address ${subSigner.addr.toString()} did not produce a valid signature when signing ${txn.txId()} for multisig account ${this._addr.toString()}`,\n )\n }\n\n signedMsigTxn = appendSignRawMultisigSignature(signedMsigTxn, this._params, subSigner.addr, sig)\n }\n\n signedMsigTxns.push(signedMsigTxn)\n }\n\n return signedMsigTxns.map((stxn) => {\n validateSignedTransaction(stxn)\n return encodeSignedTransaction(stxn)\n })\n }\n\n this._lsigSigner = async (lsig, _) => {\n let lmsig = lsig.lmsig ?? this.createMultisigSignature()\n\n for (const addrWithSigner of this.subSigners) {\n const { lsigSigner, addr } = addrWithSigner\n const result = await lsigSigner(lsig, this)\n if (!('sig' in result) || !result.sig) {\n throw new Error(\n `Signer for address ${addr.toString()} did not produce a valid signature when signing logic sig for multisig account ${this._addr.toString()}`,\n )\n }\n\n lmsig = this.applySignature(lmsig, addr.publicKey, result.sig)\n }\n\n return { addr: this.addr, lmsig }\n }\n }\n\n createMultisigTransaction(txn: Transaction): SignedTransaction {\n return createMultisigTransaction(txn, this._params)\n }\n\n createMultisigSignature(): MultisigSignature {\n const pks = toPublicKeys(this._params.addrs)\n const subsignatures: MultisigSubsignature[] = pks.map((pk) => ({\n publicKey: pk,\n signature: undefined,\n }))\n\n return {\n version: this._params.version,\n threshold: this._params.threshold,\n subsigs: subsignatures,\n }\n }\n\n applySignatureToTxn(txn: SignedTransaction, pubkey: Uint8Array, signature: Uint8Array): void {\n if (!txn.msig) {\n const createdTxn = this.createMultisigTransaction(txn.txn)\n txn.msig = createdTxn.msig\n }\n\n txn.msig = applyMultisigSubsignature(txn.msig!, pubkey, signature)\n }\n\n applySignature(msigSignature: MultisigSignature, pubkey: Uint8Array, signature: Uint8Array): MultisigSignature {\n if (msigSignature.version !== this._params.version || msigSignature.threshold !== this._params.threshold) {\n const thisParams = {\n version: this._params.version,\n threshold: this._params.threshold,\n participants: this._params.addrs.map((addr) => addr.toString()),\n }\n\n const givenParams = {\n version: msigSignature.version,\n threshold: msigSignature.threshold,\n participants: msigSignature.subsigs.map((subsig) => new Address(subsig.publicKey).toString()),\n }\n\n throw new Error(\n `Multisig signature parameters do not match expected multisig parameters. Multisig params: ${JSON.stringify(thisParams)}, signature: ${JSON.stringify(givenParams)}`,\n )\n }\n\n return applyMultisigSubsignature(msigSignature, pubkey, signature)\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"multisig.mjs","names":["msig: MultisigSignature","authAddress: Address | undefined","newSubsigs: MultisigSubsignature[]","multisigAddress: typeof addressFromMultisigPreImgAddrs","signedMsigTxns: SignedTransaction[]","subsignatures: MultisigSubsignature[]"],"sources":["../../../../packages/transact/src/multisig.ts"],"sourcesContent":["import {\n Address,\n ALGORAND_ADDRESS_BYTE_LENGTH,\n ALGORAND_CHECKSUM_BYTE_LENGTH,\n arrayEqual,\n getAddress,\n hash,\n PUBLIC_KEY_BYTE_LENGTH,\n SIGNATURE_BYTE_LENGTH,\n} from '@algorandfoundation/algokit-common'\nimport { DelegatedLsigSigner } from './logicsig'\nimport { AddressWithDelegatedLsigSigner, AddressWithTransactionSigner, TransactionSigner } from './signer'\nimport {\n decodeSignedTransaction,\n encodeSignedTransaction,\n MultisigSignature,\n MultisigSubsignature,\n SignedTransaction,\n validateSignedTransaction,\n} from './transactions/signed-transaction'\nimport { Transaction } from './transactions/transaction'\n\nconst toPublicKeys = (addrs: Array<string | Address>): Uint8Array[] => addrs.map((addr) => getAddress(addr).publicKey)\n\n/**\n * Applies a subsignature for a participant to a multisignature signature, replacing any existing signature.\n *\n * This method applies the signature to ALL instances of the given public key (to support weighted multisig).\n * Since ed25519 signatures are deterministic, there's only one valid signature for a given message and public key.\n */\nfunction applyMultisigSubsignature(\n multisigSignature: MultisigSignature,\n participant: Uint8Array,\n signature: Uint8Array,\n): MultisigSignature {\n let found = false\n const newSubsignatures = multisigSignature.subsigs.map((subsig) => {\n if (arrayEqual(subsig.publicKey, participant)) {\n found = true\n return { ...subsig, sig: signature } satisfies MultisigSubsignature\n }\n return subsig\n })\n\n if (!found) {\n throw new Error('Public key not found in multisig signature')\n }\n\n return {\n ...multisigSignature,\n subsigs: newSubsignatures,\n }\n}\n\n// Convert \"MultisigAddr\" UTF-8 to byte array\nconst MULTISIG_PREIMG2ADDR_PREFIX = new Uint8Array([77, 117, 108, 116, 105, 115, 105, 103, 65, 100, 100, 114])\n\nconst INVALID_MSIG_VERSION_ERROR_MSG = 'invalid multisig version'\nconst INVALID_MSIG_THRESHOLD_ERROR_MSG = 'bad multisig threshold'\nconst INVALID_MSIG_PK_ERROR_MSG = 'bad multisig public key - wrong length'\nconst UNEXPECTED_PK_LEN_ERROR_MSG = 'nacl public key length is not 32 bytes'\n\nconst MULTISIG_MERGE_LESSTHANTWO_ERROR_MSG = 'Not enough multisig transactions to merge. Need at least two'\nconst MULTISIG_MERGE_MISMATCH_ERROR_MSG = 'Cannot merge txs. txIDs differ'\nconst MULTISIG_MERGE_MISMATCH_AUTH_ADDR_MSG = 'Cannot merge txs. Auth addrs differ'\nconst MULTISIG_MERGE_WRONG_PREIMAGE_ERROR_MSG = 'Cannot merge txs. Multisig preimages differ'\nconst MULTISIG_MERGE_SIG_MISMATCH_ERROR_MSG = 'Cannot merge txs. subsigs are mismatched.'\nconst MULTISIG_SIGNATURE_LENGTH_ERROR_MSG = 'Cannot add multisig signature. Signature is not of the correct length.'\nconst MULTISIG_KEY_NOT_EXIST_ERROR_MSG = 'Key does not exist'\n\n/**\n * creates a raw, multisig transaction blob without any signatures.\n * @param txn - the actual transaction.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param pks - ordered list of public keys in this multisig\n * @returns encoded multisig blob\n */\nfunction createMultisigTransaction(txn: Transaction, { version, threshold, addrs }: MultisigMetadata) {\n // construct the appendable multisigned transaction format\n const pks = toPublicKeys(addrs)\n const subsignatures = pks.map(\n (pk) =>\n ({\n publicKey: pk,\n sig: undefined,\n }) satisfies MultisigSubsignature,\n )\n\n const msig: MultisigSignature = {\n version,\n threshold,\n subsigs: subsignatures,\n }\n\n // if the address of this multisig is different from the transaction sender,\n // we need to add the auth-addr field\n const msigAddr = addressFromMultisigPreImg({\n version,\n threshold,\n publicKeys: pks,\n })\n let authAddress: Address | undefined\n if (!msigAddr.equals(txn.sender)) {\n authAddress = msigAddr\n }\n\n const signedTxn: SignedTransaction = {\n txn: txn,\n msig: msig,\n authAddress,\n }\n\n return signedTxn\n}\n\ninterface MultisigOptions {\n rawSig: Uint8Array\n myPk: Uint8Array\n}\n\ninterface MultisigMetadataWithPublicKeys extends Omit<MultisigMetadata, 'addrs'> {\n publicKeys: Uint8Array[]\n}\n\n/**\n * creates a multisig transaction blob with an included signature.\n * @param txn - the actual transaction to sign.\n * @param rawSig - a Uint8Array raw signature of that transaction\n * @param myPk - a public key that corresponds with rawSig\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param pks - ordered list of public keys in this multisig\n * @returns encoded multisig blob\n */\nfunction createMultisigTransactionWithSignature(\n txn: Transaction,\n { rawSig, myPk }: MultisigOptions,\n { version, threshold, publicKeys }: MultisigMetadataWithPublicKeys,\n): SignedTransaction {\n // Create an empty encoded multisig transaction\n const signedTxn = createMultisigTransaction(txn, {\n version,\n threshold,\n addrs: publicKeys.map((pk) => new Address(pk)),\n })\n\n let keyExist = false\n\n // append the multisig signature to the corresponding public key in the multisig blob\n const updatedSubsigs = signedTxn.msig!.subsigs.map((subsig) => {\n if (arrayEqual(subsig.publicKey, myPk)) {\n keyExist = true\n return { ...subsig, sig: rawSig }\n }\n return subsig\n })\n\n if (!keyExist) {\n throw new Error(MULTISIG_KEY_NOT_EXIST_ERROR_MSG)\n }\n\n const updatedSignedTxn: SignedTransaction = {\n ...signedTxn,\n msig: {\n ...signedTxn.msig!,\n subsigs: updatedSubsigs,\n },\n }\n\n return updatedSignedTxn\n}\n\n/**\n * takes a list of multisig transaction blobs, and merges them.\n * @param multisigTxnBlobs - a list of blobs representing encoded multisig txns\n * @returns typed array msg-pack encoded multisig txn\n */\nfunction mergeMultisigTransactions(multisigTxnBlobs: SignedTransaction[]): SignedTransaction {\n if (multisigTxnBlobs.length < 2) {\n throw new Error(MULTISIG_MERGE_LESSTHANTWO_ERROR_MSG)\n }\n const refSigTx = multisigTxnBlobs[0]\n if (!refSigTx.msig) {\n throw new Error('Invalid multisig transaction, multisig structure missing at index 0')\n }\n const refTxID = refSigTx.txn.txId()\n const refAuthAddr = refSigTx.authAddress\n const refPreImage = {\n version: refSigTx.msig.version,\n threshold: refSigTx.msig.threshold,\n publicKeys: refSigTx.msig.subsigs.map((subsig) => subsig.publicKey),\n }\n const refMsigAddr = addressFromMultisigPreImg(refPreImage)\n\n const newSubsigs: MultisigSubsignature[] = refSigTx.msig.subsigs.map((sig) => ({ ...sig }))\n for (let i = 1; i < multisigTxnBlobs.length; i++) {\n const unisig = multisigTxnBlobs[i]\n if (!unisig.msig) {\n throw new Error(`Invalid multisig transaction, multisig structure missing at index ${i}`)\n }\n\n if (unisig.txn.txId() !== refTxID) {\n throw new Error(MULTISIG_MERGE_MISMATCH_ERROR_MSG)\n }\n\n const authAddr = unisig.authAddress\n if (refAuthAddr !== authAddr) {\n throw new Error(MULTISIG_MERGE_MISMATCH_AUTH_ADDR_MSG)\n }\n\n // check multisig has same preimage as reference\n if (unisig.msig.subsigs.length !== refSigTx.msig.subsigs.length) {\n throw new Error(MULTISIG_MERGE_WRONG_PREIMAGE_ERROR_MSG)\n }\n const preimg: MultisigMetadataWithPublicKeys = {\n version: unisig.msig.version,\n threshold: unisig.msig.threshold,\n publicKeys: unisig.msig.subsigs.map((subsig) => subsig.publicKey),\n }\n const msgigAddr = addressFromMultisigPreImg(preimg)\n if (refMsigAddr.toString() !== msgigAddr.toString()) {\n throw new Error(MULTISIG_MERGE_WRONG_PREIMAGE_ERROR_MSG)\n }\n\n // now, we can merge\n unisig.msig.subsigs.forEach((uniSubsig, index) => {\n if (!uniSubsig.sig) return\n const current = newSubsigs[index]\n if (current.sig && !arrayEqual(uniSubsig.sig, current.sig)) {\n // mismatch\n throw new Error(MULTISIG_MERGE_SIG_MISMATCH_ERROR_MSG)\n }\n current.sig = uniSubsig.sig\n })\n }\n\n const msig: MultisigSignature = {\n version: refSigTx.msig.version,\n threshold: refSigTx.msig.threshold,\n subsigs: newSubsigs,\n }\n\n const signedTxn: SignedTransaction = {\n txn: refSigTx.txn,\n msig: msig,\n authAddress: refAuthAddr,\n }\n\n return signedTxn\n}\n\n/**\n * Partially signs this transaction with an external raw multisig signature and returns\n * a partially-signed multisig transaction, encoded with msgpack as a typed array.\n * @param transaction - The transaction to sign\n * @param metadata - multisig metadata\n * @param signerAddr - address of the signer\n * @param signature - raw multisig signature\n * @returns an encoded, partially signed multisig transaction.\n */\nfunction partialSignWithMultisigSignature(\n transaction: Transaction,\n metadata: MultisigMetadataWithPublicKeys,\n signerAddr: string | Address,\n signature: Uint8Array,\n) {\n if (signature.length != SIGNATURE_BYTE_LENGTH) {\n throw new Error(MULTISIG_SIGNATURE_LENGTH_ERROR_MSG)\n }\n const signerAddressObj = typeof signerAddr === 'string' ? Address.fromString(signerAddr) : signerAddr\n return createMultisigTransactionWithSignature(\n transaction,\n {\n rawSig: signature,\n myPk: signerAddressObj.publicKey,\n },\n metadata,\n )\n}\n\n/**\n * Takes a multisig transaction blob, and appends a given raw signature to it.\n * This makes it possible to compile a multisig signature using only raw signatures from external methods.\n * @param multisigTxnBlob - an encoded multisig txn. Supports non-payment txn types.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param addrs - a list of Algorand addresses representing possible signers for this multisig. Order is important.\n * @param signerAddr - address of the signer\n * @param signature - raw multisig signature\n * @returns object containing txID, and blob representing encoded multisig txn\n */\nfunction appendSignRawMultisigSignature(\n multisigTxn: SignedTransaction,\n { version, threshold, addrs }: MultisigMetadata,\n signerAddr: string | Address,\n signature: Uint8Array,\n): SignedTransaction {\n const publicKeys = toPublicKeys(addrs)\n // obtain underlying txn, sign it, and merge it\n const partialSigned = partialSignWithMultisigSignature(multisigTxn.txn, { version, threshold, publicKeys }, signerAddr, signature)\n return mergeMultisigTransactions([multisigTxn, partialSigned])\n}\n\n/**\n * Takes multisig parameters and returns a 32 byte typed array public key,\n * representing an address that identifies the \"exact group, version, and public keys\" that are required for signing.\n * Hash(\"MultisigAddr\" || version uint8 || threshold uint8 || PK1 || PK2 || ...)\n * Encoding this output yields a human readable address.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param pks - array of typed array public keys\n */\nfunction addressFromMultisigPreImg({\n version,\n threshold,\n publicKeys,\n}: Omit<MultisigMetadata, 'addrs'> & {\n publicKeys: Uint8Array[]\n}): Address {\n if (version > 255 || version < 0) {\n // ^ a tad redundant, but in case in the future version != 1, still check for uint8\n throw new Error(`${INVALID_MSIG_VERSION_ERROR_MSG}: ${version}`)\n }\n if (threshold === 0 || publicKeys.length === 0 || threshold > publicKeys.length || threshold > 255) {\n throw new Error(INVALID_MSIG_THRESHOLD_ERROR_MSG)\n }\n const pkLen = ALGORAND_ADDRESS_BYTE_LENGTH - ALGORAND_CHECKSUM_BYTE_LENGTH\n if (pkLen !== PUBLIC_KEY_BYTE_LENGTH) {\n throw new Error(UNEXPECTED_PK_LEN_ERROR_MSG)\n }\n const merged = new Uint8Array(MULTISIG_PREIMG2ADDR_PREFIX.length + 2 + pkLen * publicKeys.length)\n merged.set(MULTISIG_PREIMG2ADDR_PREFIX, 0)\n merged.set([version], MULTISIG_PREIMG2ADDR_PREFIX.length)\n merged.set([threshold], MULTISIG_PREIMG2ADDR_PREFIX.length + 1)\n for (let i = 0; i < publicKeys.length; i++) {\n if (publicKeys[i].length !== pkLen) {\n throw new Error(INVALID_MSIG_PK_ERROR_MSG)\n }\n merged.set(publicKeys[i], MULTISIG_PREIMG2ADDR_PREFIX.length + 2 + i * pkLen)\n }\n return new Address(Uint8Array.from(hash(merged)))\n}\n\n/**\n * Takes multisig parameters and returns a human readable Algorand address.\n * This is equivalent to fromMultisigPreImg, but interfaces with encoded addresses.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param addrs - array of encoded addresses\n */\nfunction addressFromMultisigPreImgAddrs({ version, threshold, addrs }: MultisigMetadata): Address {\n return addressFromMultisigPreImg({\n version,\n threshold,\n publicKeys: toPublicKeys(addrs),\n })\n}\n\n/**\n * Takes multisig metadata (preimage) and returns the corresponding human readable Algorand address.\n * @param version - multisig version\n * @param threshold - multisig threshold\n * @param addrs - list of Algorand addresses\n */\nconst multisigAddress: typeof addressFromMultisigPreImgAddrs = addressFromMultisigPreImgAddrs\n\nexport interface MultisigMetadata {\n /**\n * Multisig version\n */\n version: number\n\n /**\n * Multisig threshold value. Authorization requires a subset of signatures,\n * equal to or greater than the threshold value.\n */\n threshold: number\n\n /**\n * A list of Algorand addresses representing possible signers for this multisig. Order is important.\n */\n addrs: Array<Address>\n}\n\n/** Account wrapper that supports partial or full multisig signing. */\nexport class MultisigAccount implements AddressWithTransactionSigner, AddressWithDelegatedLsigSigner {\n _params: MultisigMetadata\n _subSigners: (AddressWithTransactionSigner & AddressWithDelegatedLsigSigner)[]\n _addr: Address\n _signer: TransactionSigner\n _lsigSigner: DelegatedLsigSigner\n\n /** The parameters for the multisig account */\n get params(): Readonly<MultisigMetadata> {\n return this._params\n }\n\n /** The list of accounts that are present to sign transactions or lsigs */\n get subSigners() {\n return this._subSigners\n }\n\n /** The address of the multisig account */\n get addr(): Readonly<Address> {\n return this._addr\n }\n\n /** The transaction signer for the multisig account */\n get signer(): TransactionSigner {\n return this._signer\n }\n\n get lsigSigner(): DelegatedLsigSigner {\n return this._lsigSigner\n }\n\n static fromSignature(signature: MultisigSignature): MultisigAccount {\n const params: MultisigMetadata = {\n version: signature.version,\n threshold: signature.threshold,\n addrs: signature.subsigs.map((subsig) => new Address(subsig.publicKey)),\n }\n\n return new MultisigAccount(params, [])\n }\n\n constructor(multisigParams: MultisigMetadata, subSigners: (AddressWithTransactionSigner & AddressWithDelegatedLsigSigner)[]) {\n this._params = multisigParams\n this._subSigners = subSigners\n this._addr = multisigAddress(multisigParams)\n this._signer = async (txns: Transaction[], indexesToSign: number[]): Promise<Uint8Array[]> => {\n const txnsToSign = txns.filter((_, index) => indexesToSign.includes(index))\n const signedMsigTxns: SignedTransaction[] = []\n\n for (const txn of txnsToSign) {\n let signedMsigTxn = createMultisigTransaction(txn, this._params)\n\n for (const subSigner of this.subSigners) {\n const stxn = (await subSigner.signer([txn], [0]))[0]\n const sig = decodeSignedTransaction(stxn).sig\n\n if (!sig) {\n throw new Error(\n `Signer for address ${subSigner.addr.toString()} did not produce a valid signature when signing ${txn.txId()} for multisig account ${this._addr.toString()}`,\n )\n }\n\n signedMsigTxn = appendSignRawMultisigSignature(signedMsigTxn, this._params, subSigner.addr, sig)\n }\n\n signedMsigTxns.push(signedMsigTxn)\n }\n\n return signedMsigTxns.map((stxn) => {\n validateSignedTransaction(stxn)\n return encodeSignedTransaction(stxn)\n })\n }\n\n this._lsigSigner = async (lsig, _) => {\n let lmsig = lsig.lmsig ?? this.createMultisigSignature()\n\n for (const addrWithSigner of this.subSigners) {\n const { lsigSigner, addr } = addrWithSigner\n const result = await lsigSigner(lsig, this)\n if (!('sig' in result) || !result.sig) {\n throw new Error(\n `Signer for address ${addr.toString()} did not produce a valid signature when signing logic sig for multisig account ${this._addr.toString()}`,\n )\n }\n\n lmsig = this.applySignature(lmsig, addr.publicKey, result.sig)\n }\n\n return { addr: this.addr, lmsig }\n }\n }\n\n createMultisigTransaction(txn: Transaction): SignedTransaction {\n return createMultisigTransaction(txn, this._params)\n }\n\n createMultisigSignature(): MultisigSignature {\n const pks = toPublicKeys(this._params.addrs)\n const subsignatures: MultisigSubsignature[] = pks.map((pk) => ({\n publicKey: pk,\n sig: undefined,\n }))\n\n return {\n version: this._params.version,\n threshold: this._params.threshold,\n subsigs: subsignatures,\n }\n }\n\n applySignatureToTxn(txn: SignedTransaction, pubkey: Uint8Array, signature: Uint8Array): void {\n if (!txn.msig) {\n const createdTxn = this.createMultisigTransaction(txn.txn)\n txn.msig = createdTxn.msig\n }\n\n txn.msig = applyMultisigSubsignature(txn.msig!, pubkey, signature)\n }\n\n applySignature(msigSignature: MultisigSignature, pubkey: Uint8Array, signature: Uint8Array): MultisigSignature {\n if (msigSignature.version !== this._params.version || msigSignature.threshold !== this._params.threshold) {\n const thisParams = {\n version: this._params.version,\n threshold: this._params.threshold,\n participants: this._params.addrs.map((addr) => addr.toString()),\n }\n\n const givenParams = {\n version: msigSignature.version,\n threshold: msigSignature.threshold,\n participants: msigSignature.subsigs.map((subsig) => new Address(subsig.publicKey).toString()),\n }\n\n throw new Error(\n `Multisig signature parameters do not match expected multisig parameters. Multisig params: ${JSON.stringify(thisParams)}, signature: ${JSON.stringify(givenParams)}`,\n )\n }\n\n return applyMultisigSubsignature(msigSignature, pubkey, signature)\n }\n}\n"],"mappings":"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"}
|
|
@@ -587,6 +587,8 @@ declare class AlgorandClientTransactionCreator {
|
|
|
587
587
|
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
588
588
|
accessReferences?: ResourceReference[] | undefined;
|
|
589
589
|
rejectVersion?: number | undefined;
|
|
590
|
+
approvalProgram: string | Uint8Array;
|
|
591
|
+
clearStateProgram: string | Uint8Array;
|
|
590
592
|
schema?: {
|
|
591
593
|
globalInts: number;
|
|
592
594
|
globalByteSlices: number;
|
|
@@ -594,10 +596,8 @@ declare class AlgorandClientTransactionCreator {
|
|
|
594
596
|
localByteSlices: number;
|
|
595
597
|
} | undefined;
|
|
596
598
|
extraProgramPages?: number | undefined;
|
|
597
|
-
approvalProgram: string | Uint8Array;
|
|
598
|
-
clearStateProgram: string | Uint8Array;
|
|
599
599
|
method: ABIMethod;
|
|
600
|
-
args?: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
600
|
+
args?: (Transaction | Promise<Transaction> | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
601
601
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
602
602
|
sender: SendingAddress;
|
|
603
603
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -627,7 +627,7 @@ declare class AlgorandClientTransactionCreator {
|
|
|
627
627
|
localByteSlices: number;
|
|
628
628
|
} | undefined;
|
|
629
629
|
extraProgramPages?: number | undefined;
|
|
630
|
-
}> |
|
|
630
|
+
}> | AppMethodCall<{
|
|
631
631
|
sender: SendingAddress;
|
|
632
632
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
633
633
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -724,7 +724,7 @@ declare class AlgorandClientTransactionCreator {
|
|
|
724
724
|
approvalProgram: string | Uint8Array;
|
|
725
725
|
clearStateProgram: string | Uint8Array;
|
|
726
726
|
method: ABIMethod;
|
|
727
|
-
args?: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
727
|
+
args?: (Transaction | Promise<Transaction> | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
728
728
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
729
729
|
sender: SendingAddress;
|
|
730
730
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -754,7 +754,7 @@ declare class AlgorandClientTransactionCreator {
|
|
|
754
754
|
localByteSlices: number;
|
|
755
755
|
} | undefined;
|
|
756
756
|
extraProgramPages?: number | undefined;
|
|
757
|
-
}> |
|
|
757
|
+
}> | AppMethodCall<{
|
|
758
758
|
sender: SendingAddress;
|
|
759
759
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
760
760
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -847,7 +847,7 @@ declare class AlgorandClientTransactionCreator {
|
|
|
847
847
|
accessReferences?: ResourceReference[] | undefined;
|
|
848
848
|
rejectVersion?: number | undefined;
|
|
849
849
|
method: ABIMethod;
|
|
850
|
-
args?: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
850
|
+
args?: (Transaction | Promise<Transaction> | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
851
851
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
852
852
|
sender: SendingAddress;
|
|
853
853
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -877,7 +877,7 @@ declare class AlgorandClientTransactionCreator {
|
|
|
877
877
|
localByteSlices: number;
|
|
878
878
|
} | undefined;
|
|
879
879
|
extraProgramPages?: number | undefined;
|
|
880
|
-
}> |
|
|
880
|
+
}> | AppMethodCall<{
|
|
881
881
|
sender: SendingAddress;
|
|
882
882
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
883
883
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -970,7 +970,7 @@ declare class AlgorandClientTransactionCreator {
|
|
|
970
970
|
accessReferences?: ResourceReference[] | undefined;
|
|
971
971
|
rejectVersion?: number | undefined;
|
|
972
972
|
method: ABIMethod;
|
|
973
|
-
args?: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
973
|
+
args?: (Transaction | Promise<Transaction> | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
974
974
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
975
975
|
sender: SendingAddress;
|
|
976
976
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -1000,7 +1000,7 @@ declare class AlgorandClientTransactionCreator {
|
|
|
1000
1000
|
localByteSlices: number;
|
|
1001
1001
|
} | undefined;
|
|
1002
1002
|
extraProgramPages?: number | undefined;
|
|
1003
|
-
}> |
|
|
1003
|
+
}> | AppMethodCall<{
|
|
1004
1004
|
sender: SendingAddress;
|
|
1005
1005
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
1006
1006
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -771,6 +771,8 @@ declare class AlgorandClientTransactionSender {
|
|
|
771
771
|
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
772
772
|
accessReferences?: ResourceReference[] | undefined;
|
|
773
773
|
rejectVersion?: number | undefined;
|
|
774
|
+
approvalProgram: string | Uint8Array;
|
|
775
|
+
clearStateProgram: string | Uint8Array;
|
|
774
776
|
schema?: {
|
|
775
777
|
globalInts: number;
|
|
776
778
|
globalByteSlices: number;
|
|
@@ -778,10 +780,8 @@ declare class AlgorandClientTransactionSender {
|
|
|
778
780
|
localByteSlices: number;
|
|
779
781
|
} | undefined;
|
|
780
782
|
extraProgramPages?: number | undefined;
|
|
781
|
-
approvalProgram: string | Uint8Array;
|
|
782
|
-
clearStateProgram: string | Uint8Array;
|
|
783
783
|
method: ABIMethod;
|
|
784
|
-
args?: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
784
|
+
args?: (Transaction | Promise<Transaction> | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
785
785
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
786
786
|
sender: SendingAddress;
|
|
787
787
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -811,7 +811,7 @@ declare class AlgorandClientTransactionSender {
|
|
|
811
811
|
localByteSlices: number;
|
|
812
812
|
} | undefined;
|
|
813
813
|
extraProgramPages?: number | undefined;
|
|
814
|
-
}> |
|
|
814
|
+
}> | AppMethodCall<{
|
|
815
815
|
sender: SendingAddress;
|
|
816
816
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
817
817
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -915,7 +915,7 @@ declare class AlgorandClientTransactionSender {
|
|
|
915
915
|
approvalProgram: string | Uint8Array;
|
|
916
916
|
clearStateProgram: string | Uint8Array;
|
|
917
917
|
method: ABIMethod;
|
|
918
|
-
args?: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
918
|
+
args?: (Transaction | Promise<Transaction> | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
919
919
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
920
920
|
sender: SendingAddress;
|
|
921
921
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -945,7 +945,7 @@ declare class AlgorandClientTransactionSender {
|
|
|
945
945
|
localByteSlices: number;
|
|
946
946
|
} | undefined;
|
|
947
947
|
extraProgramPages?: number | undefined;
|
|
948
|
-
}> |
|
|
948
|
+
}> | AppMethodCall<{
|
|
949
949
|
sender: SendingAddress;
|
|
950
950
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
951
951
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -1045,7 +1045,7 @@ declare class AlgorandClientTransactionSender {
|
|
|
1045
1045
|
accessReferences?: ResourceReference[] | undefined;
|
|
1046
1046
|
rejectVersion?: number | undefined;
|
|
1047
1047
|
method: ABIMethod;
|
|
1048
|
-
args?: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
1048
|
+
args?: (Transaction | Promise<Transaction> | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
1049
1049
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
1050
1050
|
sender: SendingAddress;
|
|
1051
1051
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -1075,7 +1075,7 @@ declare class AlgorandClientTransactionSender {
|
|
|
1075
1075
|
localByteSlices: number;
|
|
1076
1076
|
} | undefined;
|
|
1077
1077
|
extraProgramPages?: number | undefined;
|
|
1078
|
-
}> |
|
|
1078
|
+
}> | AppMethodCall<{
|
|
1079
1079
|
sender: SendingAddress;
|
|
1080
1080
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
1081
1081
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -1175,7 +1175,7 @@ declare class AlgorandClientTransactionSender {
|
|
|
1175
1175
|
accessReferences?: ResourceReference[] | undefined;
|
|
1176
1176
|
rejectVersion?: number | undefined;
|
|
1177
1177
|
method: ABIMethod;
|
|
1178
|
-
args?: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
1178
|
+
args?: (Transaction | Promise<Transaction> | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
1179
1179
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
1180
1180
|
sender: SendingAddress;
|
|
1181
1181
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -1205,7 +1205,7 @@ declare class AlgorandClientTransactionSender {
|
|
|
1205
1205
|
localByteSlices: number;
|
|
1206
1206
|
} | undefined;
|
|
1207
1207
|
extraProgramPages?: number | undefined;
|
|
1208
|
-
}> |
|
|
1208
|
+
}> | AppMethodCall<{
|
|
1209
1209
|
sender: SendingAddress;
|
|
1210
1210
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
1211
1211
|
rekeyTo?: ReadableAddress | undefined;
|
package/types/app-client.d.ts
CHANGED
|
@@ -488,7 +488,7 @@ declare class AppClient {
|
|
|
488
488
|
signer: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
489
489
|
method: ABIMethod;
|
|
490
490
|
onComplete: OnApplicationComplete.UpdateApplication;
|
|
491
|
-
args: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
491
|
+
args: (Transaction | Promise<Transaction> | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
492
492
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
493
493
|
sender: SendingAddress;
|
|
494
494
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -518,7 +518,7 @@ declare class AppClient {
|
|
|
518
518
|
localByteSlices: number;
|
|
519
519
|
} | undefined;
|
|
520
520
|
extraProgramPages?: number | undefined;
|
|
521
|
-
}> |
|
|
521
|
+
}> | AppMethodCall<{
|
|
522
522
|
sender: SendingAddress;
|
|
523
523
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
524
524
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -590,7 +590,7 @@ declare class AppClient {
|
|
|
590
590
|
accessReferences?: ResourceReference[] | undefined;
|
|
591
591
|
rejectVersion?: number | undefined;
|
|
592
592
|
method: ABIMethod;
|
|
593
|
-
args?: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
593
|
+
args?: (Transaction | Promise<Transaction> | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
594
594
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
595
595
|
sender: SendingAddress;
|
|
596
596
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -620,7 +620,7 @@ declare class AppClient {
|
|
|
620
620
|
localByteSlices: number;
|
|
621
621
|
} | undefined;
|
|
622
622
|
extraProgramPages?: number | undefined;
|
|
623
|
-
}> |
|
|
623
|
+
}> | AppMethodCall<{
|
|
624
624
|
sender: SendingAddress;
|
|
625
625
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
626
626
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -692,7 +692,7 @@ declare class AppClient {
|
|
|
692
692
|
accessReferences?: ResourceReference[] | undefined;
|
|
693
693
|
rejectVersion?: number | undefined;
|
|
694
694
|
method: ABIMethod;
|
|
695
|
-
args?: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
695
|
+
args?: (Transaction | Promise<Transaction> | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
696
696
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
697
697
|
sender: SendingAddress;
|
|
698
698
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -722,7 +722,7 @@ declare class AppClient {
|
|
|
722
722
|
localByteSlices: number;
|
|
723
723
|
} | undefined;
|
|
724
724
|
extraProgramPages?: number | undefined;
|
|
725
|
-
}> |
|
|
725
|
+
}> | AppMethodCall<{
|
|
726
726
|
sender: SendingAddress;
|
|
727
727
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
728
728
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -793,7 +793,7 @@ declare class AppClient {
|
|
|
793
793
|
accessReferences?: ResourceReference[] | undefined;
|
|
794
794
|
rejectVersion?: number | undefined;
|
|
795
795
|
method: ABIMethod;
|
|
796
|
-
args?: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
796
|
+
args?: (Transaction | Promise<Transaction> | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
797
797
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
798
798
|
sender: SendingAddress;
|
|
799
799
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -823,7 +823,7 @@ declare class AppClient {
|
|
|
823
823
|
localByteSlices: number;
|
|
824
824
|
} | undefined;
|
|
825
825
|
extraProgramPages?: number | undefined;
|
|
826
|
-
}> |
|
|
826
|
+
}> | AppMethodCall<{
|
|
827
827
|
sender: SendingAddress;
|
|
828
828
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
829
829
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -894,7 +894,7 @@ declare class AppClient {
|
|
|
894
894
|
accessReferences?: ResourceReference[] | undefined;
|
|
895
895
|
rejectVersion?: number | undefined;
|
|
896
896
|
method: ABIMethod;
|
|
897
|
-
args?: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
897
|
+
args?: (Transaction | Promise<Transaction> | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
898
898
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
899
899
|
sender: SendingAddress;
|
|
900
900
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -924,7 +924,7 @@ declare class AppClient {
|
|
|
924
924
|
localByteSlices: number;
|
|
925
925
|
} | undefined;
|
|
926
926
|
extraProgramPages?: number | undefined;
|
|
927
|
-
}> |
|
|
927
|
+
}> | AppMethodCall<{
|
|
928
928
|
sender: SendingAddress;
|
|
929
929
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
930
930
|
rekeyTo?: ReadableAddress | undefined;
|
package/types/app-factory.d.ts
CHANGED
|
@@ -246,7 +246,7 @@ declare class AppFactory {
|
|
|
246
246
|
sender: Address;
|
|
247
247
|
signer: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
248
248
|
method: ABIMethod;
|
|
249
|
-
args: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
249
|
+
args: (Transaction | Promise<Transaction> | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
250
250
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
251
251
|
sender: SendingAddress;
|
|
252
252
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -276,7 +276,7 @@ declare class AppFactory {
|
|
|
276
276
|
localByteSlices: number;
|
|
277
277
|
} | undefined;
|
|
278
278
|
extraProgramPages?: number | undefined;
|
|
279
|
-
}> |
|
|
279
|
+
}> | AppMethodCall<{
|
|
280
280
|
sender: SendingAddress;
|
|
281
281
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
282
282
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -349,7 +349,7 @@ declare class AppFactory {
|
|
|
349
349
|
sender: Address;
|
|
350
350
|
signer: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
351
351
|
method: ABIMethod;
|
|
352
|
-
args: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
352
|
+
args: (Transaction | Promise<Transaction> | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
353
353
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
354
354
|
sender: SendingAddress;
|
|
355
355
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -379,7 +379,7 @@ declare class AppFactory {
|
|
|
379
379
|
localByteSlices: number;
|
|
380
380
|
} | undefined;
|
|
381
381
|
extraProgramPages?: number | undefined;
|
|
382
|
-
}> |
|
|
382
|
+
}> | AppMethodCall<{
|
|
383
383
|
sender: SendingAddress;
|
|
384
384
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
385
385
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -452,7 +452,7 @@ declare class AppFactory {
|
|
|
452
452
|
sender: Address;
|
|
453
453
|
signer: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
454
454
|
method: ABIMethod;
|
|
455
|
-
args: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
455
|
+
args: (Transaction | Promise<Transaction> | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
456
456
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
457
457
|
sender: SendingAddress;
|
|
458
458
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -482,7 +482,7 @@ declare class AppFactory {
|
|
|
482
482
|
localByteSlices: number;
|
|
483
483
|
} | undefined;
|
|
484
484
|
extraProgramPages?: number | undefined;
|
|
485
|
-
}> |
|
|
485
|
+
}> | AppMethodCall<{
|
|
486
486
|
sender: SendingAddress;
|
|
487
487
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
488
488
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -802,6 +802,7 @@ declare class AppFactory {
|
|
|
802
802
|
compiledApproval?: CompiledTeal | undefined;
|
|
803
803
|
compiledClear?: CompiledTeal | undefined;
|
|
804
804
|
operationPerformed: "create";
|
|
805
|
+
version: string;
|
|
805
806
|
updatable?: boolean | undefined;
|
|
806
807
|
deletable?: boolean | undefined;
|
|
807
808
|
createdRound: bigint;
|
|
@@ -809,7 +810,6 @@ declare class AppFactory {
|
|
|
809
810
|
createdMetadata: AppDeployMetadata;
|
|
810
811
|
deleted: boolean;
|
|
811
812
|
name: string;
|
|
812
|
-
version: string;
|
|
813
813
|
groupId: string | undefined;
|
|
814
814
|
txIds: string[];
|
|
815
815
|
returns?: ABIReturn[] | undefined;
|
|
@@ -848,6 +848,7 @@ declare class AppFactory {
|
|
|
848
848
|
compiledApproval?: CompiledTeal | undefined;
|
|
849
849
|
compiledClear?: CompiledTeal | undefined;
|
|
850
850
|
operationPerformed: "replace";
|
|
851
|
+
version: string;
|
|
851
852
|
updatable?: boolean | undefined;
|
|
852
853
|
deletable?: boolean | undefined;
|
|
853
854
|
createdRound: bigint;
|
|
@@ -855,7 +856,6 @@ declare class AppFactory {
|
|
|
855
856
|
createdMetadata: AppDeployMetadata;
|
|
856
857
|
deleted: boolean;
|
|
857
858
|
name: string;
|
|
858
|
-
version: string;
|
|
859
859
|
groupId: string | undefined;
|
|
860
860
|
txIds: string[];
|
|
861
861
|
returns?: ABIReturn[] | undefined;
|