@algorandfoundation/algokit-utils 10.0.0-alpha.5 → 10.0.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/algod-client/index.d.ts +1 -4
  2. package/package.json +1 -1
  3. package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.d.ts +3 -5
  4. package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.js +4 -6
  5. package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.js.map +1 -1
  6. package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.mjs +3 -5
  7. package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.mjs.map +1 -1
  8. package/packages/common/src/json.mjs +2 -2
  9. package/packages/common/src/json.mjs.map +1 -1
  10. package/packages/sdk/src/utils/utils.mjs +2 -2
  11. package/packages/sdk/src/utils/utils.mjs.map +1 -1
  12. package/packages/transact/src/multisig.d.ts +2 -2
  13. package/packages/transact/src/multisig.js +15 -15
  14. package/packages/transact/src/multisig.js.map +1 -1
  15. package/packages/transact/src/multisig.mjs +15 -15
  16. package/packages/transact/src/multisig.mjs.map +1 -1
  17. package/packages/transact/src/transactions/app-call.d.ts +8 -8
  18. package/packages/transact/src/transactions/app-call.js.map +1 -1
  19. package/packages/transact/src/transactions/app-call.mjs.map +1 -1
  20. package/packages/transact/src/transactions/reference-types-meta.d.ts +26 -0
  21. package/packages/transact/src/transactions/reference-types-meta.js +71 -0
  22. package/packages/transact/src/transactions/reference-types-meta.js.map +1 -0
  23. package/packages/transact/src/transactions/reference-types-meta.mjs +69 -0
  24. package/packages/transact/src/transactions/reference-types-meta.mjs.map +1 -0
  25. package/packages/transact/src/transactions/transaction-meta.js +22 -22
  26. package/packages/transact/src/transactions/transaction-meta.js.map +1 -1
  27. package/packages/transact/src/transactions/transaction-meta.mjs +22 -22
  28. package/packages/transact/src/transactions/transaction-meta.mjs.map +1 -1
  29. package/transact/index.d.ts +3 -2
  30. package/transact/index.js +4 -0
  31. package/transact/index.mjs +2 -1
  32. package/transactions/app-call.d.ts +2 -2
  33. package/transactions/app-call.js +15 -15
  34. package/transactions/app-call.js.map +1 -1
  35. package/transactions/app-call.mjs +15 -15
  36. package/transactions/app-call.mjs.map +1 -1
  37. package/transactions/asset-config.d.ts +1 -1
  38. package/transactions/asset-config.js +1 -1
  39. package/transactions/asset-config.js.map +1 -1
  40. package/transactions/asset-config.mjs +1 -1
  41. package/transactions/asset-config.mjs.map +1 -1
  42. package/types/algorand-client-transaction-creator.d.ts +80 -80
  43. package/types/algorand-client-transaction-sender.d.ts +83 -83
  44. package/types/app-client.d.ts +145 -145
  45. package/types/app-factory.d.ts +70 -70
  46. package/types/app-manager.js +5 -5
  47. package/types/app-manager.js.map +1 -1
  48. package/types/app-manager.mjs +5 -5
  49. package/types/app-manager.mjs.map +1 -1
  50. package/types/composer.js +3 -3
  51. package/types/composer.js.map +1 -1
  52. package/types/composer.mjs +3 -3
  53. package/types/composer.mjs.map +1 -1
  54. package/packages/algod_client/src/models/application-local-reference.d.ts +0 -20
  55. package/packages/algod_client/src/models/application-local-reference.js +0 -23
  56. package/packages/algod_client/src/models/application-local-reference.js.map +0 -1
  57. package/packages/algod_client/src/models/application-local-reference.mjs +0 -23
  58. package/packages/algod_client/src/models/application-local-reference.mjs.map +0 -1
  59. package/packages/algod_client/src/models/asset-holding-reference.d.ts +0 -20
  60. package/packages/algod_client/src/models/asset-holding-reference.js +0 -23
  61. package/packages/algod_client/src/models/asset-holding-reference.js.map +0 -1
  62. package/packages/algod_client/src/models/asset-holding-reference.mjs +0 -23
  63. package/packages/algod_client/src/models/asset-holding-reference.mjs.map +0 -1
  64. package/packages/algod_client/src/models/box-reference.d.ts +0 -17
  65. package/packages/algod_client/src/models/box-reference.js +0 -23
  66. package/packages/algod_client/src/models/box-reference.js.map +0 -1
  67. package/packages/algod_client/src/models/box-reference.mjs +0 -23
  68. package/packages/algod_client/src/models/box-reference.mjs.map +0 -1
@@ -20,8 +20,6 @@ import { AssetParams } from "../packages/algod_client/src/models/asset-params.js
20
20
  import { Asset } from "../packages/algod_client/src/models/asset.js";
21
21
  import { AssetHolding } from "../packages/algod_client/src/models/asset-holding.js";
22
22
  import { Account } from "../packages/algod_client/src/models/account.js";
23
- import { AssetHoldingReference } from "../packages/algod_client/src/models/asset-holding-reference.js";
24
- import { ApplicationLocalReference } from "../packages/algod_client/src/models/application-local-reference.js";
25
23
  import { AvmValue } from "../packages/algod_client/src/models/avm-value.js";
26
24
  import { AvmKeyValue } from "../packages/algod_client/src/models/avm-key-value.js";
27
25
  import { EvalDelta } from "../packages/algod_client/src/models/eval-delta.js";
@@ -33,7 +31,6 @@ import { SimulateTraceConfig } from "../packages/algod_client/src/models/simulat
33
31
  import { SimulateRequest } from "../packages/algod_client/src/models/simulate-request.js";
34
32
  import { Box } from "../packages/algod_client/src/models/box.js";
35
33
  import { BoxDescriptor } from "../packages/algod_client/src/models/box-descriptor.js";
36
- import { BoxReference } from "../packages/algod_client/src/models/box-reference.js";
37
34
  import { BuildVersion } from "../packages/algod_client/src/models/build-version.js";
38
35
  import { Version } from "../packages/algod_client/src/models/version.js";
39
36
  import { PendingTransactionResponse } from "../packages/algod_client/src/models/pending-transaction-response.js";
@@ -73,4 +70,4 @@ import { DisassembleResponse } from "../packages/algod_client/src/models/disasse
73
70
  import { SuggestedParams, SuggestedParamsMeta } from "../packages/algod_client/src/models/suggested-params.js";
74
71
  import { AlgodApi } from "../packages/algod_client/src/apis/api-service.js";
75
72
  import { AlgodClient } from "../packages/algod_client/src/client.js";
76
- export { Account, AccountApplicationResponse, AccountAssetResponse, AccountParticipation, AccountStateDelta, AlgodApi, AlgodClient, ApiError, ApiRequestOptions, Application, ApplicationInitialStates, ApplicationKvStorage, ApplicationLocalReference, ApplicationLocalState, ApplicationParams, ApplicationStateOperation, ApplicationStateSchema, ApplyData, Asset, AssetHolding, AssetHoldingReference, AssetParams, AvmKeyValue, AvmValue, BaseHttpRequest, Block, BlockAppEvalDelta, BlockEvalDelta, BlockHashResponse, BlockHeader, BlockResponse, BlockStateProofTrackingData, BlockTxidsResponse, Box, BoxDescriptor, BoxReference, BoxesResponse, BuildVersion, ClientConfig, CompileResponse, DisassembleResponse, EvalDelta, EvalDeltaKeyValue, FetchHttpRequest, Genesis, GenesisAllocation, GetBlockTimeStampOffsetResponse, GetSyncRoundResponse, LedgerStateDelta, LedgerStateDeltaForTransactionGroup, LightBlockHeaderProof, NodeStatusResponse, ParticipationUpdates, PendingTransactionResponse, PendingTransactionsResponse, PostTransactionsResponse, ScratchChange, SignedTxnInBlock, SignedTxnWithAD, SimulateInitialStates, SimulateRequest, SimulateRequestTransactionGroup, SimulateResponse, SimulateTraceConfig, SimulateTransactionGroupResult, SimulateTransactionResult, SimulateUnnamedResourcesAccessed, SimulationEvalOverrides, SimulationOpcodeTraceUnit, SimulationTransactionExecTrace, SourceMap, StateDelta, StateProof, StateProofMessage, SuggestedParams, SuggestedParamsMeta, SupplyResponse, TealKeyValue, TealKeyValueStore, TealValue, TransactionGroupLedgerStateDeltasForRoundResponse, TransactionParametersResponse, TransactionProof, Version, decodeJson, decodeMsgpack, encodeJson, encodeMsgpack, inputValueAsString };
73
+ export { Account, AccountApplicationResponse, AccountAssetResponse, AccountParticipation, AccountStateDelta, AlgodApi, AlgodClient, ApiError, ApiRequestOptions, Application, ApplicationInitialStates, ApplicationKvStorage, ApplicationLocalState, ApplicationParams, ApplicationStateOperation, ApplicationStateSchema, ApplyData, Asset, AssetHolding, AssetParams, AvmKeyValue, AvmValue, BaseHttpRequest, Block, BlockAppEvalDelta, BlockEvalDelta, BlockHashResponse, BlockHeader, BlockResponse, BlockStateProofTrackingData, BlockTxidsResponse, Box, BoxDescriptor, BoxesResponse, BuildVersion, ClientConfig, CompileResponse, DisassembleResponse, EvalDelta, EvalDeltaKeyValue, FetchHttpRequest, Genesis, GenesisAllocation, GetBlockTimeStampOffsetResponse, GetSyncRoundResponse, LedgerStateDelta, LedgerStateDeltaForTransactionGroup, LightBlockHeaderProof, NodeStatusResponse, ParticipationUpdates, PendingTransactionResponse, PendingTransactionsResponse, PostTransactionsResponse, ScratchChange, SignedTxnInBlock, SignedTxnWithAD, SimulateInitialStates, SimulateRequest, SimulateRequestTransactionGroup, SimulateResponse, SimulateTraceConfig, SimulateTransactionGroupResult, SimulateTransactionResult, SimulateUnnamedResourcesAccessed, SimulationEvalOverrides, SimulationOpcodeTraceUnit, SimulationTransactionExecTrace, SourceMap, StateDelta, StateProof, StateProofMessage, SuggestedParams, SuggestedParamsMeta, SupplyResponse, TealKeyValue, TealKeyValueStore, TealValue, TransactionGroupLedgerStateDeltasForRoundResponse, TransactionParametersResponse, TransactionProof, Version, decodeJson, decodeMsgpack, encodeJson, encodeMsgpack, inputValueAsString };
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "**"
7
7
  ],
8
8
  "name": "@algorandfoundation/algokit-utils",
9
- "version": "10.0.0-alpha.5",
9
+ "version": "10.0.0-alpha.6",
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",
@@ -1,7 +1,5 @@
1
1
  import { Address } from "../../../common/src/address.js";
2
- import { AssetHoldingReference } from "./asset-holding-reference.js";
3
- import { ApplicationLocalReference } from "./application-local-reference.js";
4
- import { BoxReference } from "./box-reference.js";
2
+ import { BoxReference, HoldingReference, LocalsReference } from "../../../transact/src/transactions/app-call.js";
5
3
 
6
4
  //#region packages/algod_client/src/models/simulate-unnamed-resources-accessed.d.ts
7
5
 
@@ -32,11 +30,11 @@ type SimulateUnnamedResourcesAccessed = {
32
30
  /**
33
31
  * The unnamed asset holdings that were referenced. The order of this array is arbitrary.
34
32
  */
35
- assetHoldings?: AssetHoldingReference[];
33
+ assetHoldings?: HoldingReference[];
36
34
  /**
37
35
  * The unnamed application local states that were referenced. The order of this array is arbitrary.
38
36
  */
39
- appLocals?: ApplicationLocalReference[];
37
+ appLocals?: LocalsReference[];
40
38
  };
41
39
  //#endregion
42
40
  export { SimulateUnnamedResourcesAccessed };
@@ -1,9 +1,7 @@
1
1
  const require_number = require('../../../common/src/codecs/primitives/number.js');
2
2
  const require_array = require('../../../common/src/codecs/composite/array.js');
3
3
  const require_object_model = require('../../../common/src/codecs/models/object-model.js');
4
- const require_asset_holding_reference = require('./asset-holding-reference.js');
5
- const require_application_local_reference = require('./application-local-reference.js');
6
- const require_box_reference = require('./box-reference.js');
4
+ const require_reference_types_meta = require('../../../transact/src/transactions/reference-types-meta.js');
7
5
 
8
6
  //#region packages/algod_client/src/models/simulate-unnamed-resources-accessed.ts
9
7
  const SimulateUnnamedResourcesAccessedMeta = {
@@ -32,7 +30,7 @@ const SimulateUnnamedResourcesAccessedMeta = {
32
30
  name: "boxes",
33
31
  wireKey: "boxes",
34
32
  optional: true,
35
- codec: new require_array.ArrayCodec(new require_object_model.ObjectModelCodec(require_box_reference.BoxReferenceMeta))
33
+ codec: new require_array.ArrayCodec(new require_object_model.ObjectModelCodec(require_reference_types_meta.BoxReferenceMeta))
36
34
  },
37
35
  {
38
36
  name: "extraBoxRefs",
@@ -44,13 +42,13 @@ const SimulateUnnamedResourcesAccessedMeta = {
44
42
  name: "assetHoldings",
45
43
  wireKey: "asset-holdings",
46
44
  optional: true,
47
- codec: new require_array.ArrayCodec(new require_object_model.ObjectModelCodec(require_asset_holding_reference.AssetHoldingReferenceMeta))
45
+ codec: new require_array.ArrayCodec(new require_object_model.ObjectModelCodec(require_reference_types_meta.HoldingReferenceMeta))
48
46
  },
49
47
  {
50
48
  name: "appLocals",
51
49
  wireKey: "app-locals",
52
50
  optional: true,
53
- codec: new require_array.ArrayCodec(new require_object_model.ObjectModelCodec(require_application_local_reference.ApplicationLocalReferenceMeta))
51
+ codec: new require_array.ArrayCodec(new require_object_model.ObjectModelCodec(require_reference_types_meta.LocalsReferenceMeta))
54
52
  }
55
53
  ]
56
54
  };
@@ -1 +1 @@
1
- {"version":3,"file":"simulate-unnamed-resources-accessed.js","names":["SimulateUnnamedResourcesAccessedMeta: ObjectModelMetadata<SimulateUnnamedResourcesAccessed>","addressArrayCodec","bigIntArrayCodec","ArrayCodec","ObjectModelCodec","BoxReferenceMeta","numberCodec","AssetHoldingReferenceMeta","ApplicationLocalReferenceMeta"],"sources":["../../../../../packages/algod_client/src/models/simulate-unnamed-resources-accessed.ts"],"sourcesContent":["import type { Address, ObjectModelMetadata } from '@algorandfoundation/algokit-common'\nimport { numberCodec, ArrayCodec, bigIntArrayCodec, addressArrayCodec, ObjectModelCodec } from '@algorandfoundation/algokit-common'\nimport type { ApplicationLocalReference } from './application-local-reference'\nimport { ApplicationLocalReferenceMeta } from './application-local-reference'\nimport type { AssetHoldingReference } from './asset-holding-reference'\nimport { AssetHoldingReferenceMeta } from './asset-holding-reference'\nimport type { BoxReference } from './box-reference'\nimport { BoxReferenceMeta } from './box-reference'\n\n/**\n * These are resources that were accessed by this group that would normally have caused failure, but were allowed in simulation. Depending on where this object is in the response, the unnamed resources it contains may or may not qualify for group resource sharing. If this is a field in SimulateTransactionGroupResult, the resources do qualify, but if this is a field in SimulateTransactionResult, they do not qualify. In order to make this group valid for actual submission, resources that qualify for group sharing can be made available by any transaction of the group; otherwise, resources must be placed in the same transaction which accessed them.\n */\nexport type SimulateUnnamedResourcesAccessed = {\n /**\n * The unnamed accounts that were referenced. The order of this array is arbitrary.\n */\n accounts?: Address[]\n\n /**\n * The unnamed assets that were referenced. The order of this array is arbitrary.\n */\n assets?: bigint[]\n\n /**\n * The unnamed applications that were referenced. The order of this array is arbitrary.\n */\n apps?: bigint[]\n\n /**\n * The unnamed boxes that were referenced. The order of this array is arbitrary.\n */\n boxes?: BoxReference[]\n\n /**\n * The number of extra box references used to increase the IO budget. This is in addition to the references defined in the input transaction group and any referenced to unnamed boxes.\n */\n extraBoxRefs?: number\n\n /**\n * The unnamed asset holdings that were referenced. The order of this array is arbitrary.\n */\n assetHoldings?: AssetHoldingReference[]\n\n /**\n * The unnamed application local states that were referenced. The order of this array is arbitrary.\n */\n appLocals?: ApplicationLocalReference[]\n}\n\nexport const SimulateUnnamedResourcesAccessedMeta: ObjectModelMetadata<SimulateUnnamedResourcesAccessed> = {\n name: 'SimulateUnnamedResourcesAccessed',\n kind: 'object',\n fields: [\n {\n name: 'accounts',\n wireKey: 'accounts',\n optional: true,\n codec: addressArrayCodec,\n },\n {\n name: 'assets',\n wireKey: 'assets',\n optional: true,\n codec: bigIntArrayCodec,\n },\n {\n name: 'apps',\n wireKey: 'apps',\n optional: true,\n codec: bigIntArrayCodec,\n },\n {\n name: 'boxes',\n wireKey: 'boxes',\n optional: true,\n codec: new ArrayCodec(new ObjectModelCodec(BoxReferenceMeta)),\n },\n {\n name: 'extraBoxRefs',\n wireKey: 'extra-box-refs',\n optional: true,\n codec: numberCodec,\n },\n {\n name: 'assetHoldings',\n wireKey: 'asset-holdings',\n optional: true,\n codec: new ArrayCodec(new ObjectModelCodec(AssetHoldingReferenceMeta)),\n },\n {\n name: 'appLocals',\n wireKey: 'app-locals',\n optional: true,\n codec: new ArrayCodec(new ObjectModelCodec(ApplicationLocalReferenceMeta)),\n },\n ],\n}\n"],"mappings":";;;;;;;;AAiDA,MAAaA,uCAA8F;CACzG,MAAM;CACN,MAAM;CACN,QAAQ;EACN;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAOC;GACR;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAOC;GACR;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAOA;GACR;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO,IAAIC,yBAAW,IAAIC,sCAAiBC,uCAAiB,CAAC;GAC9D;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAOC;GACR;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO,IAAIH,yBAAW,IAAIC,sCAAiBG,0DAA0B,CAAC;GACvE;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO,IAAIJ,yBAAW,IAAIC,sCAAiBI,kEAA8B,CAAC;GAC3E;EACF;CACF"}
1
+ {"version":3,"file":"simulate-unnamed-resources-accessed.js","names":["SimulateUnnamedResourcesAccessedMeta: ObjectModelMetadata<SimulateUnnamedResourcesAccessed>","addressArrayCodec","bigIntArrayCodec","ArrayCodec","ObjectModelCodec","BoxReferenceMeta","numberCodec","HoldingReferenceMeta","LocalsReferenceMeta"],"sources":["../../../../../packages/algod_client/src/models/simulate-unnamed-resources-accessed.ts"],"sourcesContent":["import type { Address, ObjectModelMetadata } from '@algorandfoundation/algokit-common'\nimport { numberCodec, ArrayCodec, bigIntArrayCodec, addressArrayCodec, ObjectModelCodec } from '@algorandfoundation/algokit-common'\nimport type { BoxReference, HoldingReference, LocalsReference } from '@algorandfoundation/algokit-transact'\nimport { BoxReferenceMeta, HoldingReferenceMeta, LocalsReferenceMeta } from '@algorandfoundation/algokit-transact'\n\n/**\n * These are resources that were accessed by this group that would normally have caused failure, but were allowed in simulation. Depending on where this object is in the response, the unnamed resources it contains may or may not qualify for group resource sharing. If this is a field in SimulateTransactionGroupResult, the resources do qualify, but if this is a field in SimulateTransactionResult, they do not qualify. In order to make this group valid for actual submission, resources that qualify for group sharing can be made available by any transaction of the group; otherwise, resources must be placed in the same transaction which accessed them.\n */\nexport type SimulateUnnamedResourcesAccessed = {\n /**\n * The unnamed accounts that were referenced. The order of this array is arbitrary.\n */\n accounts?: Address[]\n\n /**\n * The unnamed assets that were referenced. The order of this array is arbitrary.\n */\n assets?: bigint[]\n\n /**\n * The unnamed applications that were referenced. The order of this array is arbitrary.\n */\n apps?: bigint[]\n\n /**\n * The unnamed boxes that were referenced. The order of this array is arbitrary.\n */\n boxes?: BoxReference[]\n\n /**\n * The number of extra box references used to increase the IO budget. This is in addition to the references defined in the input transaction group and any referenced to unnamed boxes.\n */\n extraBoxRefs?: number\n\n /**\n * The unnamed asset holdings that were referenced. The order of this array is arbitrary.\n */\n assetHoldings?: HoldingReference[]\n\n /**\n * The unnamed application local states that were referenced. The order of this array is arbitrary.\n */\n appLocals?: LocalsReference[]\n}\n\nexport const SimulateUnnamedResourcesAccessedMeta: ObjectModelMetadata<SimulateUnnamedResourcesAccessed> = {\n name: 'SimulateUnnamedResourcesAccessed',\n kind: 'object',\n fields: [\n {\n name: 'accounts',\n wireKey: 'accounts',\n optional: true,\n codec: addressArrayCodec,\n },\n {\n name: 'assets',\n wireKey: 'assets',\n optional: true,\n codec: bigIntArrayCodec,\n },\n {\n name: 'apps',\n wireKey: 'apps',\n optional: true,\n codec: bigIntArrayCodec,\n },\n {\n name: 'boxes',\n wireKey: 'boxes',\n optional: true,\n codec: new ArrayCodec(new ObjectModelCodec(BoxReferenceMeta)),\n },\n {\n name: 'extraBoxRefs',\n wireKey: 'extra-box-refs',\n optional: true,\n codec: numberCodec,\n },\n {\n name: 'assetHoldings',\n wireKey: 'asset-holdings',\n optional: true,\n codec: new ArrayCodec(new ObjectModelCodec(HoldingReferenceMeta)),\n },\n {\n name: 'appLocals',\n wireKey: 'app-locals',\n optional: true,\n codec: new ArrayCodec(new ObjectModelCodec(LocalsReferenceMeta)),\n },\n ],\n}\n"],"mappings":";;;;;;AA6CA,MAAaA,uCAA8F;CACzG,MAAM;CACN,MAAM;CACN,QAAQ;EACN;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAOC;GACR;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAOC;GACR;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAOA;GACR;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO,IAAIC,yBAAW,IAAIC,sCAAiBC,8CAAiB,CAAC;GAC9D;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAOC;GACR;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO,IAAIH,yBAAW,IAAIC,sCAAiBG,kDAAqB,CAAC;GAClE;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO,IAAIJ,yBAAW,IAAIC,sCAAiBI,iDAAoB,CAAC;GACjE;EACF;CACF"}
@@ -1,9 +1,7 @@
1
1
  import { numberCodec } from "../../../common/src/codecs/primitives/number.mjs";
2
2
  import { ArrayCodec, addressArrayCodec, bigIntArrayCodec } from "../../../common/src/codecs/composite/array.mjs";
3
3
  import { ObjectModelCodec } from "../../../common/src/codecs/models/object-model.mjs";
4
- import { AssetHoldingReferenceMeta } from "./asset-holding-reference.mjs";
5
- import { ApplicationLocalReferenceMeta } from "./application-local-reference.mjs";
6
- import { BoxReferenceMeta } from "./box-reference.mjs";
4
+ import { BoxReferenceMeta, HoldingReferenceMeta, LocalsReferenceMeta } from "../../../transact/src/transactions/reference-types-meta.mjs";
7
5
 
8
6
  //#region packages/algod_client/src/models/simulate-unnamed-resources-accessed.ts
9
7
  const SimulateUnnamedResourcesAccessedMeta = {
@@ -44,13 +42,13 @@ const SimulateUnnamedResourcesAccessedMeta = {
44
42
  name: "assetHoldings",
45
43
  wireKey: "asset-holdings",
46
44
  optional: true,
47
- codec: new ArrayCodec(new ObjectModelCodec(AssetHoldingReferenceMeta))
45
+ codec: new ArrayCodec(new ObjectModelCodec(HoldingReferenceMeta))
48
46
  },
49
47
  {
50
48
  name: "appLocals",
51
49
  wireKey: "app-locals",
52
50
  optional: true,
53
- codec: new ArrayCodec(new ObjectModelCodec(ApplicationLocalReferenceMeta))
51
+ codec: new ArrayCodec(new ObjectModelCodec(LocalsReferenceMeta))
54
52
  }
55
53
  ]
56
54
  };
@@ -1 +1 @@
1
- {"version":3,"file":"simulate-unnamed-resources-accessed.mjs","names":["SimulateUnnamedResourcesAccessedMeta: ObjectModelMetadata<SimulateUnnamedResourcesAccessed>"],"sources":["../../../../../packages/algod_client/src/models/simulate-unnamed-resources-accessed.ts"],"sourcesContent":["import type { Address, ObjectModelMetadata } from '@algorandfoundation/algokit-common'\nimport { numberCodec, ArrayCodec, bigIntArrayCodec, addressArrayCodec, ObjectModelCodec } from '@algorandfoundation/algokit-common'\nimport type { ApplicationLocalReference } from './application-local-reference'\nimport { ApplicationLocalReferenceMeta } from './application-local-reference'\nimport type { AssetHoldingReference } from './asset-holding-reference'\nimport { AssetHoldingReferenceMeta } from './asset-holding-reference'\nimport type { BoxReference } from './box-reference'\nimport { BoxReferenceMeta } from './box-reference'\n\n/**\n * These are resources that were accessed by this group that would normally have caused failure, but were allowed in simulation. Depending on where this object is in the response, the unnamed resources it contains may or may not qualify for group resource sharing. If this is a field in SimulateTransactionGroupResult, the resources do qualify, but if this is a field in SimulateTransactionResult, they do not qualify. In order to make this group valid for actual submission, resources that qualify for group sharing can be made available by any transaction of the group; otherwise, resources must be placed in the same transaction which accessed them.\n */\nexport type SimulateUnnamedResourcesAccessed = {\n /**\n * The unnamed accounts that were referenced. The order of this array is arbitrary.\n */\n accounts?: Address[]\n\n /**\n * The unnamed assets that were referenced. The order of this array is arbitrary.\n */\n assets?: bigint[]\n\n /**\n * The unnamed applications that were referenced. The order of this array is arbitrary.\n */\n apps?: bigint[]\n\n /**\n * The unnamed boxes that were referenced. The order of this array is arbitrary.\n */\n boxes?: BoxReference[]\n\n /**\n * The number of extra box references used to increase the IO budget. This is in addition to the references defined in the input transaction group and any referenced to unnamed boxes.\n */\n extraBoxRefs?: number\n\n /**\n * The unnamed asset holdings that were referenced. The order of this array is arbitrary.\n */\n assetHoldings?: AssetHoldingReference[]\n\n /**\n * The unnamed application local states that were referenced. The order of this array is arbitrary.\n */\n appLocals?: ApplicationLocalReference[]\n}\n\nexport const SimulateUnnamedResourcesAccessedMeta: ObjectModelMetadata<SimulateUnnamedResourcesAccessed> = {\n name: 'SimulateUnnamedResourcesAccessed',\n kind: 'object',\n fields: [\n {\n name: 'accounts',\n wireKey: 'accounts',\n optional: true,\n codec: addressArrayCodec,\n },\n {\n name: 'assets',\n wireKey: 'assets',\n optional: true,\n codec: bigIntArrayCodec,\n },\n {\n name: 'apps',\n wireKey: 'apps',\n optional: true,\n codec: bigIntArrayCodec,\n },\n {\n name: 'boxes',\n wireKey: 'boxes',\n optional: true,\n codec: new ArrayCodec(new ObjectModelCodec(BoxReferenceMeta)),\n },\n {\n name: 'extraBoxRefs',\n wireKey: 'extra-box-refs',\n optional: true,\n codec: numberCodec,\n },\n {\n name: 'assetHoldings',\n wireKey: 'asset-holdings',\n optional: true,\n codec: new ArrayCodec(new ObjectModelCodec(AssetHoldingReferenceMeta)),\n },\n {\n name: 'appLocals',\n wireKey: 'app-locals',\n optional: true,\n codec: new ArrayCodec(new ObjectModelCodec(ApplicationLocalReferenceMeta)),\n },\n ],\n}\n"],"mappings":";;;;;;;;AAiDA,MAAaA,uCAA8F;CACzG,MAAM;CACN,MAAM;CACN,QAAQ;EACN;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO;GACR;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO;GACR;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO;GACR;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO,IAAI,WAAW,IAAI,iBAAiB,iBAAiB,CAAC;GAC9D;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO;GACR;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO,IAAI,WAAW,IAAI,iBAAiB,0BAA0B,CAAC;GACvE;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO,IAAI,WAAW,IAAI,iBAAiB,8BAA8B,CAAC;GAC3E;EACF;CACF"}
1
+ {"version":3,"file":"simulate-unnamed-resources-accessed.mjs","names":["SimulateUnnamedResourcesAccessedMeta: ObjectModelMetadata<SimulateUnnamedResourcesAccessed>"],"sources":["../../../../../packages/algod_client/src/models/simulate-unnamed-resources-accessed.ts"],"sourcesContent":["import type { Address, ObjectModelMetadata } from '@algorandfoundation/algokit-common'\nimport { numberCodec, ArrayCodec, bigIntArrayCodec, addressArrayCodec, ObjectModelCodec } from '@algorandfoundation/algokit-common'\nimport type { BoxReference, HoldingReference, LocalsReference } from '@algorandfoundation/algokit-transact'\nimport { BoxReferenceMeta, HoldingReferenceMeta, LocalsReferenceMeta } from '@algorandfoundation/algokit-transact'\n\n/**\n * These are resources that were accessed by this group that would normally have caused failure, but were allowed in simulation. Depending on where this object is in the response, the unnamed resources it contains may or may not qualify for group resource sharing. If this is a field in SimulateTransactionGroupResult, the resources do qualify, but if this is a field in SimulateTransactionResult, they do not qualify. In order to make this group valid for actual submission, resources that qualify for group sharing can be made available by any transaction of the group; otherwise, resources must be placed in the same transaction which accessed them.\n */\nexport type SimulateUnnamedResourcesAccessed = {\n /**\n * The unnamed accounts that were referenced. The order of this array is arbitrary.\n */\n accounts?: Address[]\n\n /**\n * The unnamed assets that were referenced. The order of this array is arbitrary.\n */\n assets?: bigint[]\n\n /**\n * The unnamed applications that were referenced. The order of this array is arbitrary.\n */\n apps?: bigint[]\n\n /**\n * The unnamed boxes that were referenced. The order of this array is arbitrary.\n */\n boxes?: BoxReference[]\n\n /**\n * The number of extra box references used to increase the IO budget. This is in addition to the references defined in the input transaction group and any referenced to unnamed boxes.\n */\n extraBoxRefs?: number\n\n /**\n * The unnamed asset holdings that were referenced. The order of this array is arbitrary.\n */\n assetHoldings?: HoldingReference[]\n\n /**\n * The unnamed application local states that were referenced. The order of this array is arbitrary.\n */\n appLocals?: LocalsReference[]\n}\n\nexport const SimulateUnnamedResourcesAccessedMeta: ObjectModelMetadata<SimulateUnnamedResourcesAccessed> = {\n name: 'SimulateUnnamedResourcesAccessed',\n kind: 'object',\n fields: [\n {\n name: 'accounts',\n wireKey: 'accounts',\n optional: true,\n codec: addressArrayCodec,\n },\n {\n name: 'assets',\n wireKey: 'assets',\n optional: true,\n codec: bigIntArrayCodec,\n },\n {\n name: 'apps',\n wireKey: 'apps',\n optional: true,\n codec: bigIntArrayCodec,\n },\n {\n name: 'boxes',\n wireKey: 'boxes',\n optional: true,\n codec: new ArrayCodec(new ObjectModelCodec(BoxReferenceMeta)),\n },\n {\n name: 'extraBoxRefs',\n wireKey: 'extra-box-refs',\n optional: true,\n codec: numberCodec,\n },\n {\n name: 'assetHoldings',\n wireKey: 'asset-holdings',\n optional: true,\n codec: new ArrayCodec(new ObjectModelCodec(HoldingReferenceMeta)),\n },\n {\n name: 'appLocals',\n wireKey: 'app-locals',\n optional: true,\n codec: new ArrayCodec(new ObjectModelCodec(LocalsReferenceMeta)),\n },\n ],\n}\n"],"mappings":";;;;;;AA6CA,MAAaA,uCAA8F;CACzG,MAAM;CACN,MAAM;CACN,QAAQ;EACN;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO;GACR;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO;GACR;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO;GACR;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO,IAAI,WAAW,IAAI,iBAAiB,iBAAiB,CAAC;GAC9D;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO;GACR;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO,IAAI,WAAW,IAAI,iBAAiB,qBAAqB,CAAC;GAClE;EACD;GACE,MAAM;GACN,SAAS;GACT,UAAU;GACV,OAAO,IAAI,WAAW,IAAI,iBAAiB,oBAAoB,CAAC;GACjE;EACF;CACF"}
@@ -1,7 +1,7 @@
1
- import JSONbigFactory from "json-bigint";
1
+ import JSONbigWithoutConfig from "json-bigint";
2
2
 
3
3
  //#region packages/common/src/json.ts
4
- const JSONbig = JSONbigFactory({
4
+ const JSONbig = JSONbigWithoutConfig({
5
5
  useNativeBigInt: true,
6
6
  strict: true
7
7
  });
@@ -1 +1 @@
1
- {"version":3,"file":"json.mjs","names":[],"sources":["../../../../packages/common/src/json.ts"],"sourcesContent":["import JSONbigFactory from 'json-bigint'\n\nconst JSONbig = JSONbigFactory({\n useNativeBigInt: true,\n strict: true,\n})\n\n/**\n * Parse JSON with bigint support.\n * @param str - The JSON string to parse.\n */\nexport function parseJson(str: string) {\n return JSONbig.parse(str, (_: string, value: unknown): unknown => {\n if (value != null && typeof value === 'object' && Object.getPrototypeOf(value) == null) {\n // JSONbig.parse objects are created with Object.create(null) and thus have a null prototype\n Object.setPrototypeOf(value, Object.prototype)\n }\n\n if (typeof value === 'bigint') {\n if (value > Number.MAX_SAFE_INTEGER) {\n return value\n }\n // JSONbig.parse converts number to BigInts if they are >= 10**15. This is smaller than\n // Number.MAX_SAFE_INTEGER, so we can convert some BigInts back to normal numbers.\n return Number(value)\n }\n\n return value\n })\n}\n\n/**\n * Convert a JavaScript value to a JSON string with bigint support.\n *\n * @param value - A JavaScript value, usually an object or array, to be converted.\n * @param replacer - A function that transforms the results.\n * @param space - Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n */\nexport function stringifyJson(\n value: unknown,\n replacer?: (this: unknown, key: string, value: unknown) => unknown,\n space?: string | number,\n): string {\n return JSONbig.stringify(value, replacer, space)\n}\n"],"mappings":";;;AAEA,MAAM,UAAU,eAAe;CAC7B,iBAAiB;CACjB,QAAQ;CACT,CAAC;;;;;AAMF,SAAgB,UAAU,KAAa;AACrC,QAAO,QAAQ,MAAM,MAAM,GAAW,UAA4B;AAChE,MAAI,SAAS,QAAQ,OAAO,UAAU,YAAY,OAAO,eAAe,MAAM,IAAI,KAEhF,QAAO,eAAe,OAAO,OAAO,UAAU;AAGhD,MAAI,OAAO,UAAU,UAAU;AAC7B,OAAI,QAAQ,OAAO,iBACjB,QAAO;AAIT,UAAO,OAAO,MAAM;;AAGtB,SAAO;GACP;;;;;;;;;AAUJ,SAAgB,cACd,OACA,UACA,OACQ;AACR,QAAO,QAAQ,UAAU,OAAO,UAAU,MAAM"}
1
+ {"version":3,"file":"json.mjs","names":["JSONbigFactory"],"sources":["../../../../packages/common/src/json.ts"],"sourcesContent":["import JSONbigFactory from 'json-bigint'\n\nconst JSONbig = JSONbigFactory({\n useNativeBigInt: true,\n strict: true,\n})\n\n/**\n * Parse JSON with bigint support.\n * @param str - The JSON string to parse.\n */\nexport function parseJson(str: string) {\n return JSONbig.parse(str, (_: string, value: unknown): unknown => {\n if (value != null && typeof value === 'object' && Object.getPrototypeOf(value) == null) {\n // JSONbig.parse objects are created with Object.create(null) and thus have a null prototype\n Object.setPrototypeOf(value, Object.prototype)\n }\n\n if (typeof value === 'bigint') {\n if (value > Number.MAX_SAFE_INTEGER) {\n return value\n }\n // JSONbig.parse converts number to BigInts if they are >= 10**15. This is smaller than\n // Number.MAX_SAFE_INTEGER, so we can convert some BigInts back to normal numbers.\n return Number(value)\n }\n\n return value\n })\n}\n\n/**\n * Convert a JavaScript value to a JSON string with bigint support.\n *\n * @param value - A JavaScript value, usually an object or array, to be converted.\n * @param replacer - A function that transforms the results.\n * @param space - Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n */\nexport function stringifyJson(\n value: unknown,\n replacer?: (this: unknown, key: string, value: unknown) => unknown,\n space?: string | number,\n): string {\n return JSONbig.stringify(value, replacer, space)\n}\n"],"mappings":";;;AAEA,MAAM,UAAUA,qBAAe;CAC7B,iBAAiB;CACjB,QAAQ;CACT,CAAC;;;;;AAMF,SAAgB,UAAU,KAAa;AACrC,QAAO,QAAQ,MAAM,MAAM,GAAW,UAA4B;AAChE,MAAI,SAAS,QAAQ,OAAO,UAAU,YAAY,OAAO,eAAe,MAAM,IAAI,KAEhF,QAAO,eAAe,OAAO,OAAO,UAAU;AAGhD,MAAI,OAAO,UAAU,UAAU;AAC7B,OAAI,QAAQ,OAAO,iBACjB,QAAO;AAIT,UAAO,OAAO,MAAM;;AAGtB,SAAO;GACP;;;;;;;;;AAUJ,SAAgB,cACd,OACA,UACA,OACQ;AACR,QAAO,QAAQ,UAAU,OAAO,UAAU,MAAM"}
@@ -1,8 +1,8 @@
1
1
  import intDecoding_default from "../types/intDecoding.mjs";
2
- import JSONbigFactory from "json-bigint";
2
+ import JSONbigWithoutConfig from "json-bigint";
3
3
 
4
4
  //#region packages/sdk/src/utils/utils.ts
5
- const JSONbig = JSONbigFactory({
5
+ const JSONbig = JSONbigWithoutConfig({
6
6
  useNativeBigInt: true,
7
7
  strict: true
8
8
  });
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","names":["JSONbigWithoutConfig","IntDecoding"],"sources":["../../../../../packages/sdk/src/utils/utils.ts"],"sourcesContent":["import JSONbigWithoutConfig from 'json-bigint'\nimport IntDecoding from '../types/intDecoding.js'\n\nconst JSONbig = JSONbigWithoutConfig({\n useNativeBigInt: true,\n strict: true,\n})\n\nexport interface ParseJSONOptions {\n intDecoding: IntDecoding\n}\n\n/**\n * Parse JSON with additional options.\n * @param str - The JSON string to parse.\n * @param options - Configures how integers in this JSON string will be decoded. See the\n * `IntDecoding` enum for more details.\n */\nexport function parseJSON(str: string, { intDecoding }: ParseJSONOptions) {\n if (\n intDecoding !== IntDecoding.SAFE &&\n intDecoding !== IntDecoding.UNSAFE &&\n intDecoding !== IntDecoding.BIGINT &&\n intDecoding !== IntDecoding.MIXED\n ) {\n throw new Error(`Invalid intDecoding option: ${intDecoding}`)\n }\n return JSONbig.parse(str, (_: string, value: any): any => {\n if (value != null && typeof value === 'object' && Object.getPrototypeOf(value) == null) {\n // JSONbig.parse objects are created with Object.create(null) and thus have a null prototype\n // let us remedy that\n Object.setPrototypeOf(value, Object.prototype)\n }\n\n if (typeof value === 'bigint') {\n if (intDecoding === IntDecoding.SAFE && value > Number.MAX_SAFE_INTEGER) {\n throw new Error(`Integer exceeds maximum safe integer: ${value.toString()}. Try parsing with a different intDecoding option.`)\n }\n if (intDecoding === IntDecoding.BIGINT || (intDecoding === IntDecoding.MIXED && value > Number.MAX_SAFE_INTEGER)) {\n return value\n }\n // JSONbig.parse converts number to BigInts if they are >= 10**15. This is smaller than\n // Number.MAX_SAFE_INTEGER, so we can convert some BigInts back to normal numbers.\n return Number(value)\n }\n\n if (typeof value === 'number') {\n if (intDecoding === IntDecoding.BIGINT && Number.isInteger(value)) {\n return BigInt(value)\n }\n }\n\n return value\n })\n}\n\n/**\n * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.\n *\n * This functions differs from the built-in JSON.stringify in that it supports serializing BigInts.\n *\n * This function takes the same arguments as the built-in JSON.stringify function.\n *\n * @param value - A JavaScript value, usually an object or array, to be converted.\n * @param replacer - A function that transforms the results.\n * @param space - Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n */\nexport function stringifyJSON(value: any, replacer?: (this: any, key: string, value: any) => any, space?: string | number): string {\n return JSONbig.stringify(value, replacer, space)\n}\n\n/**\n * ArrayEqual takes two arrays and return true if equal, false otherwise\n */\nexport function arrayEqual<T>(a: ArrayLike<T>, b: ArrayLike<T>): boolean {\n if (a.length !== b.length) {\n return false\n }\n return Array.from(a).every((val, i) => val === b[i])\n}\n\n/**\n * ConcatArrays takes n number arrays and returns a joint Uint8Array\n * @param arrs - An arbitrary number of n array-like number list arguments\n * @returns [a,b]\n */\nexport function concatArrays(...arrs: ArrayLike<number>[]) {\n const size = arrs.reduce((sum, arr) => sum + arr.length, 0)\n const c = new Uint8Array(size)\n\n let offset = 0\n for (let i = 0; i < arrs.length; i++) {\n c.set(arrs[i], offset)\n offset += arrs[i].length\n }\n\n return c\n}\n\n/**\n * Remove undefined properties from an object\n * @param obj - An object, preferably one with some undefined properties\n * @returns A copy of the object with undefined properties removed\n */\nexport function removeUndefinedProperties(obj: Record<string | number | symbol, any>) {\n const mutableCopy = { ...obj }\n Object.keys(mutableCopy).forEach((key) => {\n if (typeof mutableCopy[key] === 'undefined') delete mutableCopy[key]\n })\n return mutableCopy\n}\n\n/**\n * Check whether the environment is Node.js (as opposed to the browser)\n * @returns True if Node.js environment, false otherwise\n */\nexport function isNode() {\n return (\n // @ts-ignore\n typeof process === 'object' &&\n // @ts-ignore\n typeof process.versions === 'object' &&\n // @ts-ignore\n typeof process.versions.node !== 'undefined'\n )\n}\n\n/**\n * Check whether the environment is ReactNative\n * @returns True if ReactNative, false otherwise\n */\nexport function isReactNative() {\n const { navigator } = globalThis as { navigator?: { product?: string } }\n if (typeof navigator === 'object' && navigator.product === 'ReactNative') {\n return true\n }\n return false\n}\n\nexport function ensureSafeInteger(value: unknown): number {\n if (typeof value === 'undefined') {\n throw new Error('Value is undefined')\n }\n if (typeof value === 'bigint') {\n if (value > BigInt(Number.MAX_SAFE_INTEGER) || value < BigInt(Number.MIN_SAFE_INTEGER)) {\n throw new Error(`BigInt value ${value} is not a safe integer`)\n }\n return Number(value)\n }\n if (typeof value === 'number') {\n if (Number.isSafeInteger(value)) {\n return value\n }\n throw new Error(`Value ${value} is not a safe integer`)\n }\n throw new Error(`Unexpected type ${typeof value}, ${value}`)\n}\n\nexport function ensureSafeUnsignedInteger(value: unknown): number {\n const intValue = ensureSafeInteger(value)\n if (intValue < 0) {\n throw new Error(`Value ${intValue} is negative`)\n }\n return intValue\n}\n\nexport function ensureBigInt(value: unknown): bigint {\n if (typeof value === 'undefined') {\n throw new Error('Value is undefined')\n }\n if (typeof value === 'bigint') {\n return value\n }\n if (typeof value === 'number') {\n if (!Number.isSafeInteger(value)) {\n throw new Error(`Value ${value} is not a safe integer`)\n }\n return BigInt(value)\n }\n throw new Error(`Unexpected type ${typeof value}, ${value}`)\n}\n\nexport function ensureUint64(value: unknown): bigint {\n const bigIntValue = ensureBigInt(value)\n if (bigIntValue < 0 || bigIntValue > BigInt('0xffffffffffffffff')) {\n throw new Error(`Value ${bigIntValue} is not a uint64`)\n }\n return bigIntValue\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.mjs","names":["IntDecoding"],"sources":["../../../../../packages/sdk/src/utils/utils.ts"],"sourcesContent":["import JSONbigWithoutConfig from 'json-bigint'\nimport IntDecoding from '../types/intDecoding.js'\n\nconst JSONbig = JSONbigWithoutConfig({\n useNativeBigInt: true,\n strict: true,\n})\n\nexport interface ParseJSONOptions {\n intDecoding: IntDecoding\n}\n\n/**\n * Parse JSON with additional options.\n * @param str - The JSON string to parse.\n * @param options - Configures how integers in this JSON string will be decoded. See the\n * `IntDecoding` enum for more details.\n */\nexport function parseJSON(str: string, { intDecoding }: ParseJSONOptions) {\n if (\n intDecoding !== IntDecoding.SAFE &&\n intDecoding !== IntDecoding.UNSAFE &&\n intDecoding !== IntDecoding.BIGINT &&\n intDecoding !== IntDecoding.MIXED\n ) {\n throw new Error(`Invalid intDecoding option: ${intDecoding}`)\n }\n return JSONbig.parse(str, (_: string, value: any): any => {\n if (value != null && typeof value === 'object' && Object.getPrototypeOf(value) == null) {\n // JSONbig.parse objects are created with Object.create(null) and thus have a null prototype\n // let us remedy that\n Object.setPrototypeOf(value, Object.prototype)\n }\n\n if (typeof value === 'bigint') {\n if (intDecoding === IntDecoding.SAFE && value > Number.MAX_SAFE_INTEGER) {\n throw new Error(`Integer exceeds maximum safe integer: ${value.toString()}. Try parsing with a different intDecoding option.`)\n }\n if (intDecoding === IntDecoding.BIGINT || (intDecoding === IntDecoding.MIXED && value > Number.MAX_SAFE_INTEGER)) {\n return value\n }\n // JSONbig.parse converts number to BigInts if they are >= 10**15. This is smaller than\n // Number.MAX_SAFE_INTEGER, so we can convert some BigInts back to normal numbers.\n return Number(value)\n }\n\n if (typeof value === 'number') {\n if (intDecoding === IntDecoding.BIGINT && Number.isInteger(value)) {\n return BigInt(value)\n }\n }\n\n return value\n })\n}\n\n/**\n * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.\n *\n * This functions differs from the built-in JSON.stringify in that it supports serializing BigInts.\n *\n * This function takes the same arguments as the built-in JSON.stringify function.\n *\n * @param value - A JavaScript value, usually an object or array, to be converted.\n * @param replacer - A function that transforms the results.\n * @param space - Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n */\nexport function stringifyJSON(value: any, replacer?: (this: any, key: string, value: any) => any, space?: string | number): string {\n return JSONbig.stringify(value, replacer, space)\n}\n\n/**\n * ArrayEqual takes two arrays and return true if equal, false otherwise\n */\nexport function arrayEqual<T>(a: ArrayLike<T>, b: ArrayLike<T>): boolean {\n if (a.length !== b.length) {\n return false\n }\n return Array.from(a).every((val, i) => val === b[i])\n}\n\n/**\n * ConcatArrays takes n number arrays and returns a joint Uint8Array\n * @param arrs - An arbitrary number of n array-like number list arguments\n * @returns [a,b]\n */\nexport function concatArrays(...arrs: ArrayLike<number>[]) {\n const size = arrs.reduce((sum, arr) => sum + arr.length, 0)\n const c = new Uint8Array(size)\n\n let offset = 0\n for (let i = 0; i < arrs.length; i++) {\n c.set(arrs[i], offset)\n offset += arrs[i].length\n }\n\n return c\n}\n\n/**\n * Remove undefined properties from an object\n * @param obj - An object, preferably one with some undefined properties\n * @returns A copy of the object with undefined properties removed\n */\nexport function removeUndefinedProperties(obj: Record<string | number | symbol, any>) {\n const mutableCopy = { ...obj }\n Object.keys(mutableCopy).forEach((key) => {\n if (typeof mutableCopy[key] === 'undefined') delete mutableCopy[key]\n })\n return mutableCopy\n}\n\n/**\n * Check whether the environment is Node.js (as opposed to the browser)\n * @returns True if Node.js environment, false otherwise\n */\nexport function isNode() {\n return (\n // @ts-ignore\n typeof process === 'object' &&\n // @ts-ignore\n typeof process.versions === 'object' &&\n // @ts-ignore\n typeof process.versions.node !== 'undefined'\n )\n}\n\n/**\n * Check whether the environment is ReactNative\n * @returns True if ReactNative, false otherwise\n */\nexport function isReactNative() {\n const { navigator } = globalThis as { navigator?: { product?: string } }\n if (typeof navigator === 'object' && navigator.product === 'ReactNative') {\n return true\n }\n return false\n}\n\nexport function ensureSafeInteger(value: unknown): number {\n if (typeof value === 'undefined') {\n throw new Error('Value is undefined')\n }\n if (typeof value === 'bigint') {\n if (value > BigInt(Number.MAX_SAFE_INTEGER) || value < BigInt(Number.MIN_SAFE_INTEGER)) {\n throw new Error(`BigInt value ${value} is not a safe integer`)\n }\n return Number(value)\n }\n if (typeof value === 'number') {\n if (Number.isSafeInteger(value)) {\n return value\n }\n throw new Error(`Value ${value} is not a safe integer`)\n }\n throw new Error(`Unexpected type ${typeof value}, ${value}`)\n}\n\nexport function ensureSafeUnsignedInteger(value: unknown): number {\n const intValue = ensureSafeInteger(value)\n if (intValue < 0) {\n throw new Error(`Value ${intValue} is negative`)\n }\n return intValue\n}\n\nexport function ensureBigInt(value: unknown): bigint {\n if (typeof value === 'undefined') {\n throw new Error('Value is undefined')\n }\n if (typeof value === 'bigint') {\n return value\n }\n if (typeof value === 'number') {\n if (!Number.isSafeInteger(value)) {\n throw new Error(`Value ${value} is not a safe integer`)\n }\n return BigInt(value)\n }\n throw new Error(`Unexpected type ${typeof value}, ${value}`)\n}\n\nexport function ensureUint64(value: unknown): bigint {\n const bigIntValue = ensureBigInt(value)\n if (bigIntValue < 0 || bigIntValue > BigInt('0xffffffffffffffff')) {\n throw new Error(`Value ${bigIntValue} is not a uint64`)\n }\n return bigIntValue\n}\n"],"mappings":"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"}
@@ -87,9 +87,9 @@ declare function appendSignRawMultisigSignature(multisigTxnBlob: Uint8Array, {
87
87
  declare function addressFromMultisigPreImg({
88
88
  version,
89
89
  threshold,
90
- pks
90
+ publicKeys
91
91
  }: Omit<MultisigMetadata, 'addrs'> & {
92
- pks: Uint8Array[];
92
+ publicKeys: Uint8Array[];
93
93
  }): Address;
94
94
  /**
95
95
  * Takes multisig parameters and returns a human readable Algorand address.
@@ -34,7 +34,7 @@ function addressFromMultisigSignature(multisigSignature) {
34
34
  return addressFromMultisigPreImg({
35
35
  version: multisigSignature.version,
36
36
  threshold: multisigSignature.threshold,
37
- pks: multisigSignature.subsignatures.map((subsig) => subsig.publicKey)
37
+ publicKeys: multisigSignature.subsignatures.map((subsig) => subsig.publicKey)
38
38
  });
39
39
  }
40
40
  /**
@@ -132,7 +132,7 @@ function createMultisigTransaction(txn, { version, threshold, addrs }) {
132
132
  const msigAddr = addressFromMultisigPreImg({
133
133
  version,
134
134
  threshold,
135
- pks
135
+ publicKeys: pks
136
136
  });
137
137
  let authAddress;
138
138
  if (!msigAddr.equals(txn.sender)) authAddress = msigAddr;
@@ -152,11 +152,11 @@ function createMultisigTransaction(txn, { version, threshold, addrs }) {
152
152
  * @param pks - ordered list of public keys in this multisig
153
153
  * @returns encoded multisig blob
154
154
  */
155
- function createMultisigTransactionWithSignature(txn, { rawSig, myPk }, { version, threshold, pks }) {
155
+ function createMultisigTransactionWithSignature(txn, { rawSig, myPk }, { version, threshold, publicKeys }) {
156
156
  const signedTxn = require_signed_transaction.decodeSignedTransaction(createMultisigTransaction(txn, {
157
157
  version,
158
158
  threshold,
159
- addrs: pks.map((pk) => new require_address.Address(pk))
159
+ addrs: publicKeys.map((pk) => new require_address.Address(pk))
160
160
  }));
161
161
  let keyExist = false;
162
162
  const updatedSubsigs = signedTxn.msig.subsignatures.map((subsig) => {
@@ -192,7 +192,7 @@ function mergeMultisigTransactions(multisigTxnBlobs) {
192
192
  const refMsigAddr = addressFromMultisigPreImg({
193
193
  version: refSigTx.msig.version,
194
194
  threshold: refSigTx.msig.threshold,
195
- pks: refSigTx.msig.subsignatures.map((subsig) => subsig.publicKey)
195
+ publicKeys: refSigTx.msig.subsignatures.map((subsig) => subsig.publicKey)
196
196
  });
197
197
  const newSubsigs = refSigTx.msig.subsignatures.map((sig) => ({ ...sig }));
198
198
  for (let i = 1; i < multisigTxnBlobs.length; i++) {
@@ -204,7 +204,7 @@ function mergeMultisigTransactions(multisigTxnBlobs) {
204
204
  const msgigAddr = addressFromMultisigPreImg({
205
205
  version: unisig.msig.version,
206
206
  threshold: unisig.msig.threshold,
207
- pks: unisig.msig.subsignatures.map((subsig) => subsig.publicKey)
207
+ publicKeys: unisig.msig.subsignatures.map((subsig) => subsig.publicKey)
208
208
  });
209
209
  if (refMsigAddr.toString() !== msgigAddr.toString()) throw new Error(MULTISIG_MERGE_WRONG_PREIMAGE_ERROR_MSG);
210
210
  unisig.msig.subsignatures.forEach((uniSubsig, index) => {
@@ -252,12 +252,12 @@ function partialSignWithMultisigSignature(transaction, metadata, signerAddr, sig
252
252
  * @returns object containing txID, and blob representing encoded multisig txn
253
253
  */
254
254
  function appendSignRawMultisigSignature(multisigTxnBlob, { version, threshold, addrs }, signerAddr, signature) {
255
- const pks = toPublicKeys(addrs);
255
+ const publicKeys = toPublicKeys(addrs);
256
256
  const multisigTxObj = require_signed_transaction.decodeSignedTransaction(multisigTxnBlob);
257
257
  const partialSignedBlob = partialSignWithMultisigSignature(multisigTxObj.txn, {
258
258
  version,
259
259
  threshold,
260
- pks
260
+ publicKeys
261
261
  }, signerAddr, signature);
262
262
  return {
263
263
  txID: multisigTxObj.txn.txId(),
@@ -273,18 +273,18 @@ function appendSignRawMultisigSignature(multisigTxnBlob, { version, threshold, a
273
273
  * @param threshold - multisig threshold
274
274
  * @param pks - array of typed array public keys
275
275
  */
276
- function addressFromMultisigPreImg({ version, threshold, pks }) {
276
+ function addressFromMultisigPreImg({ version, threshold, publicKeys }) {
277
277
  if (version > 255 || version < 0) throw new Error(`${INVALID_MSIG_VERSION_ERROR_MSG}: ${version}`);
278
- if (threshold === 0 || pks.length === 0 || threshold > pks.length || threshold > 255) throw new Error(INVALID_MSIG_THRESHOLD_ERROR_MSG);
278
+ if (threshold === 0 || publicKeys.length === 0 || threshold > publicKeys.length || threshold > 255) throw new Error(INVALID_MSIG_THRESHOLD_ERROR_MSG);
279
279
  const pkLen = require_address.ALGORAND_ADDRESS_BYTE_LENGTH - require_address.ALGORAND_CHECKSUM_BYTE_LENGTH;
280
280
  if (pkLen !== require_constants.PUBLIC_KEY_BYTE_LENGTH) throw new Error(UNEXPECTED_PK_LEN_ERROR_MSG);
281
- const merged = new Uint8Array(MULTISIG_PREIMG2ADDR_PREFIX.length + 2 + pkLen * pks.length);
281
+ const merged = new Uint8Array(MULTISIG_PREIMG2ADDR_PREFIX.length + 2 + pkLen * publicKeys.length);
282
282
  merged.set(MULTISIG_PREIMG2ADDR_PREFIX, 0);
283
283
  merged.set([version], MULTISIG_PREIMG2ADDR_PREFIX.length);
284
284
  merged.set([threshold], MULTISIG_PREIMG2ADDR_PREFIX.length + 1);
285
- for (let i = 0; i < pks.length; i++) {
286
- if (pks[i].length !== pkLen) throw new Error(INVALID_MSIG_PK_ERROR_MSG);
287
- merged.set(pks[i], MULTISIG_PREIMG2ADDR_PREFIX.length + 2 + i * pkLen);
285
+ for (let i = 0; i < publicKeys.length; i++) {
286
+ if (publicKeys[i].length !== pkLen) throw new Error(INVALID_MSIG_PK_ERROR_MSG);
287
+ merged.set(publicKeys[i], MULTISIG_PREIMG2ADDR_PREFIX.length + 2 + i * pkLen);
288
288
  }
289
289
  return new require_address.Address(Uint8Array.from(require_crypto.hash(merged)));
290
290
  }
@@ -299,7 +299,7 @@ function addressFromMultisigPreImgAddrs({ version, threshold, addrs }) {
299
299
  return addressFromMultisigPreImg({
300
300
  version,
301
301
  threshold,
302
- pks: toPublicKeys(addrs)
302
+ publicKeys: toPublicKeys(addrs)
303
303
  });
304
304
  }
305
305
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"multisig.js","names":["getAddress","arrayEqual","mergedSubsignatures: MultisigSubsignature[]","msig: MultisigSignature","authAddress: Address | undefined","encodeSignedTransaction","decodeSignedTransaction","Address","newSubsigs: MultisigSubsignature[]","SIGNATURE_BYTE_LENGTH","ALGORAND_ADDRESS_BYTE_LENGTH","ALGORAND_CHECKSUM_BYTE_LENGTH","PUBLIC_KEY_BYTE_LENGTH","hash","multisigAddress: typeof addressFromMultisigPreImgAddrs","signedMsigTxns: Uint8Array[]","decodeMsgpack","multiSignatureCodec"],"sources":["../../../../packages/transact/src/multisig.ts"],"sourcesContent":["import {\n Address,\n ALGORAND_ADDRESS_BYTE_LENGTH,\n ALGORAND_CHECKSUM_BYTE_LENGTH,\n arrayEqual,\n decodeMsgpack,\n getAddress,\n hash,\n PUBLIC_KEY_BYTE_LENGTH,\n SIGNATURE_BYTE_LENGTH,\n} from '@algorandfoundation/algokit-common'\nimport { AddressWithDelegatedLsigSigner, AddressWithTransactionSigner, TransactionSigner } from './signer'\nimport {\n decodeSignedTransaction,\n encodeSignedTransaction,\n MultisigSignature,\n MultisigSubsignature,\n SignedTransaction,\n} from './transactions/signed-transaction'\nimport { multiSignatureCodec } from './transactions/signed-transaction-meta'\nimport { Transaction } from './transactions/transaction'\n\n/**\n * Creates an empty multisignature signature from a list of participant public keys.\n */\nexport function newMultisigSignature(version: number, threshold: number, participants: Uint8Array[]): MultisigSignature {\n if (version === 0) {\n throw new Error('Version cannot be zero')\n }\n if (participants.length === 0) {\n throw new Error('Participants cannot be empty')\n }\n if (threshold === 0 || threshold > participants.length) {\n throw new Error('Threshold must be greater than zero and less than or equal to the number of participants')\n }\n\n return {\n version,\n threshold,\n subsignatures: participants.map((publicKey) => ({ publicKey })),\n }\n}\n\n/**\n * Returns the list of participant public keys from a multisignature signature.\n */\nexport function participantsFromMultisigSignature(multisigSignature: MultisigSignature): Uint8Array[] {\n return multisigSignature.subsignatures.map((subsig) => subsig.publicKey)\n}\n\nconst toPublicKeys = (addrs: Array<string | Address>): Uint8Array[] => addrs.map((addr) => getAddress(addr).publicKey)\n\n/**\n * Returns the address of the multisignature account.\n */\nexport function addressFromMultisigSignature(multisigSignature: MultisigSignature): Address {\n return addressFromMultisigPreImg({\n version: multisigSignature.version,\n threshold: multisigSignature.threshold,\n pks: multisigSignature.subsignatures.map((subsig) => subsig.publicKey),\n })\n}\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 */\nexport function applyMultisigSubsignature(\n multisigSignature: MultisigSignature,\n participant: Uint8Array,\n signature: Uint8Array,\n): MultisigSignature {\n let found = false\n const newSubsignatures = multisigSignature.subsignatures.map((subsig) => {\n if (arrayEqual(subsig.publicKey, participant)) {\n found = true\n return { ...subsig, signature }\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 subsignatures: newSubsignatures,\n }\n}\n\n/**\n * Merges two multisignature signatures, replacing signatures in the first with those from the second where present.\n * For each participant, the resulting signature will be taken from the second multisig if present, otherwise from the first.\n */\nexport function mergeMultisignatures(multisigSignatureA: MultisigSignature, multisigSignatureB: MultisigSignature): MultisigSignature {\n if (multisigSignatureA.version !== multisigSignatureB.version) {\n throw new Error('Cannot merge multisig signatures with different versions')\n }\n if (multisigSignatureA.threshold !== multisigSignatureB.threshold) {\n throw new Error('Cannot merge multisig signatures with different thresholds')\n }\n\n // Check participants match exactly (same public keys in same order)\n const participantsA = participantsFromMultisigSignature(multisigSignatureA)\n const participantsB = participantsFromMultisigSignature(multisigSignatureB)\n const participantsMatch =\n participantsA.length === participantsB.length && participantsA.every((pk, i) => arrayEqual(pk, participantsB[i]))\n if (!participantsMatch) {\n throw new Error('Cannot merge multisig signatures with different participants')\n }\n\n const mergedSubsignatures: MultisigSubsignature[] = multisigSignatureA.subsignatures.map((s1, index) => {\n const s2 = multisigSignatureB.subsignatures[index]\n return {\n publicKey: s1.publicKey,\n signature: s2.signature || s1.signature, // Prefer s2, fall back to s1\n }\n })\n\n return {\n version: multisigSignatureA.version,\n threshold: multisigSignatureA.threshold,\n subsignatures: mergedSubsignatures,\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\nexport const MULTISIG_MERGE_LESSTHANTWO_ERROR_MSG = 'Not enough multisig transactions to merge. Need at least two'\nexport const MULTISIG_MERGE_MISMATCH_ERROR_MSG = 'Cannot merge txs. txIDs differ'\nexport const MULTISIG_MERGE_MISMATCH_AUTH_ADDR_MSG = 'Cannot merge txs. Auth addrs differ'\nexport const MULTISIG_MERGE_WRONG_PREIMAGE_ERROR_MSG = 'Cannot merge txs. Multisig preimages differ'\nexport const MULTISIG_MERGE_SIG_MISMATCH_ERROR_MSG = 'Cannot merge txs. subsigs are mismatched.'\nexport const MULTISIG_NO_MUTATE_ERROR_MSG = 'Cannot mutate a multisig field as it would invalidate all existing signatures.'\nexport const MULTISIG_USE_PARTIAL_SIGN_ERROR_MSG = 'Cannot sign a multisig transaction using `signTxn`. Use `partialSignTxn` instead.'\nexport const 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 */\nexport function createMultisigTransaction(txn: Transaction, { version, threshold, addrs }: MultisigMetadata) {\n // construct the appendable multisigned transaction format\n const pks = toPublicKeys(addrs)\n const subsignatures: MultisigSubsignature[] = pks.map((pk) => ({\n publicKey: pk,\n signature: undefined,\n }))\n\n const msig: MultisigSignature = {\n version,\n threshold,\n 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 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 encodeSignedTransaction(signedTxn)\n}\n\ninterface MultisigOptions {\n rawSig: Uint8Array\n myPk: Uint8Array\n}\n\ninterface MultisigMetadataWithPks extends Omit<MultisigMetadata, 'addrs'> {\n pks: 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, pks }: MultisigMetadataWithPks,\n): Uint8Array {\n // Create an empty encoded multisig transaction\n const encodedMsig = createMultisigTransaction(txn, {\n version,\n threshold,\n addrs: pks.map((pk) => new Address(pk)),\n })\n // note: this is not signed yet, but will be shortly\n const signedTxn = decodeSignedTransaction(encodedMsig)\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!.subsignatures.map((subsig) => {\n if (arrayEqual(subsig.publicKey, myPk)) {\n keyExist = true\n return { ...subsig, signature: 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 subsignatures: updatedSubsigs,\n },\n }\n\n return encodeSignedTransaction(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 */\nexport function mergeMultisigTransactions(multisigTxnBlobs: Uint8Array[]) {\n if (multisigTxnBlobs.length < 2) {\n throw new Error(MULTISIG_MERGE_LESSTHANTWO_ERROR_MSG)\n }\n const refSigTx = decodeSignedTransaction(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 pks: refSigTx.msig.subsignatures.map((subsig) => subsig.publicKey),\n }\n const refMsigAddr = addressFromMultisigPreImg(refPreImage)\n\n const newSubsigs: MultisigSubsignature[] = refSigTx.msig.subsignatures.map((sig) => ({ ...sig }))\n for (let i = 1; i < multisigTxnBlobs.length; i++) {\n const unisig = decodeSignedTransaction(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.subsignatures.length !== refSigTx.msig.subsignatures.length) {\n throw new Error(MULTISIG_MERGE_WRONG_PREIMAGE_ERROR_MSG)\n }\n const preimg: MultisigMetadataWithPks = {\n version: unisig.msig.version,\n threshold: unisig.msig.threshold,\n pks: unisig.msig.subsignatures.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.subsignatures.forEach((uniSubsig, index) => {\n if (!uniSubsig.signature) return\n const current = newSubsigs[index]\n if (current.signature && !arrayEqual(uniSubsig.signature, current.signature)) {\n // mismatch\n throw new Error(MULTISIG_MERGE_SIG_MISMATCH_ERROR_MSG)\n }\n current.signature = uniSubsig.signature\n })\n }\n\n const msig: MultisigSignature = {\n version: refSigTx.msig.version,\n threshold: refSigTx.msig.threshold,\n subsignatures: newSubsigs,\n }\n\n const signedTxn: SignedTransaction = {\n txn: refSigTx.txn,\n msig: msig,\n authAddress: refAuthAddr,\n }\n\n return encodeSignedTransaction(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: MultisigMetadataWithPks,\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 */\nexport function appendSignRawMultisigSignature(\n multisigTxnBlob: Uint8Array,\n { version, threshold, addrs }: MultisigMetadata,\n signerAddr: string | Address,\n signature: Uint8Array,\n) {\n const pks = toPublicKeys(addrs)\n // obtain underlying txn, sign it, and merge it\n const multisigTxObj = decodeSignedTransaction(multisigTxnBlob)\n const partialSignedBlob = partialSignWithMultisigSignature(multisigTxObj.txn, { version, threshold, pks }, signerAddr, signature)\n return {\n txID: multisigTxObj.txn.txId(),\n blob: mergeMultisigTransactions([multisigTxnBlob, partialSignedBlob]),\n }\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 */\nexport function addressFromMultisigPreImg({\n version,\n threshold,\n pks,\n}: Omit<MultisigMetadata, 'addrs'> & {\n pks: 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 || pks.length === 0 || threshold > pks.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 * pks.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 < pks.length; i++) {\n if (pks[i].length !== pkLen) {\n throw new Error(INVALID_MSIG_PK_ERROR_MSG)\n }\n merged.set(pks[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 */\nexport function addressFromMultisigPreImgAddrs({ version, threshold, addrs }: MultisigMetadata): Address {\n return addressFromMultisigPreImg({\n version,\n threshold,\n pks: 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 */\nexport const 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 {\n _params: MultisigMetadata\n _subSigners: (AddressWithTransactionSigner & AddressWithDelegatedLsigSigner)[]\n _addr: Address\n _signer: TransactionSigner\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 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: Uint8Array[] = []\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).blob\n }\n\n signedMsigTxns.push(signedMsigTxn)\n }\n\n return signedMsigTxns\n }\n }\n}\n/**\n * Decodes MsgPack bytes into a multi signature.\n *\n * @param encodedMultiSignature - The MsgPack encoded multi signature\n * @returns The decoded MultisigSignature or an error if decoding fails.\n */\nexport function decodeMultiSignature(encodedMultiSignature: Uint8Array): MultisigSignature {\n const decodedData = decodeMsgpack(encodedMultiSignature)\n return multiSignatureCodec.decode(decodedData, 'msgpack')\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"multisig.js","names":["getAddress","arrayEqual","mergedSubsignatures: MultisigSubsignature[]","msig: MultisigSignature","authAddress: Address | undefined","encodeSignedTransaction","decodeSignedTransaction","Address","newSubsigs: MultisigSubsignature[]","SIGNATURE_BYTE_LENGTH","ALGORAND_ADDRESS_BYTE_LENGTH","ALGORAND_CHECKSUM_BYTE_LENGTH","PUBLIC_KEY_BYTE_LENGTH","hash","multisigAddress: typeof addressFromMultisigPreImgAddrs","signedMsigTxns: Uint8Array[]","decodeMsgpack","multiSignatureCodec"],"sources":["../../../../packages/transact/src/multisig.ts"],"sourcesContent":["import {\n Address,\n ALGORAND_ADDRESS_BYTE_LENGTH,\n ALGORAND_CHECKSUM_BYTE_LENGTH,\n arrayEqual,\n decodeMsgpack,\n getAddress,\n hash,\n PUBLIC_KEY_BYTE_LENGTH,\n SIGNATURE_BYTE_LENGTH,\n} from '@algorandfoundation/algokit-common'\nimport { AddressWithDelegatedLsigSigner, AddressWithTransactionSigner, TransactionSigner } from './signer'\nimport {\n decodeSignedTransaction,\n encodeSignedTransaction,\n MultisigSignature,\n MultisigSubsignature,\n SignedTransaction,\n} from './transactions/signed-transaction'\nimport { multiSignatureCodec } from './transactions/signed-transaction-meta'\nimport { Transaction } from './transactions/transaction'\n\n/**\n * Creates an empty multisignature signature from a list of participant public keys.\n */\nexport function newMultisigSignature(version: number, threshold: number, participants: Uint8Array[]): MultisigSignature {\n if (version === 0) {\n throw new Error('Version cannot be zero')\n }\n if (participants.length === 0) {\n throw new Error('Participants cannot be empty')\n }\n if (threshold === 0 || threshold > participants.length) {\n throw new Error('Threshold must be greater than zero and less than or equal to the number of participants')\n }\n\n return {\n version,\n threshold,\n subsignatures: participants.map((publicKey) => ({ publicKey })),\n }\n}\n\n/**\n * Returns the list of participant public keys from a multisignature signature.\n */\nexport function participantsFromMultisigSignature(multisigSignature: MultisigSignature): Uint8Array[] {\n return multisigSignature.subsignatures.map((subsig) => subsig.publicKey)\n}\n\nconst toPublicKeys = (addrs: Array<string | Address>): Uint8Array[] => addrs.map((addr) => getAddress(addr).publicKey)\n\n/**\n * Returns the address of the multisignature account.\n */\nexport function addressFromMultisigSignature(multisigSignature: MultisigSignature): Address {\n return addressFromMultisigPreImg({\n version: multisigSignature.version,\n threshold: multisigSignature.threshold,\n publicKeys: multisigSignature.subsignatures.map((subsig) => subsig.publicKey),\n })\n}\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 */\nexport function applyMultisigSubsignature(\n multisigSignature: MultisigSignature,\n participant: Uint8Array,\n signature: Uint8Array,\n): MultisigSignature {\n let found = false\n const newSubsignatures = multisigSignature.subsignatures.map((subsig) => {\n if (arrayEqual(subsig.publicKey, participant)) {\n found = true\n return { ...subsig, signature }\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 subsignatures: newSubsignatures,\n }\n}\n\n/**\n * Merges two multisignature signatures, replacing signatures in the first with those from the second where present.\n * For each participant, the resulting signature will be taken from the second multisig if present, otherwise from the first.\n */\nexport function mergeMultisignatures(multisigSignatureA: MultisigSignature, multisigSignatureB: MultisigSignature): MultisigSignature {\n if (multisigSignatureA.version !== multisigSignatureB.version) {\n throw new Error('Cannot merge multisig signatures with different versions')\n }\n if (multisigSignatureA.threshold !== multisigSignatureB.threshold) {\n throw new Error('Cannot merge multisig signatures with different thresholds')\n }\n\n // Check participants match exactly (same public keys in same order)\n const participantsA = participantsFromMultisigSignature(multisigSignatureA)\n const participantsB = participantsFromMultisigSignature(multisigSignatureB)\n const participantsMatch =\n participantsA.length === participantsB.length && participantsA.every((pk, i) => arrayEqual(pk, participantsB[i]))\n if (!participantsMatch) {\n throw new Error('Cannot merge multisig signatures with different participants')\n }\n\n const mergedSubsignatures: MultisigSubsignature[] = multisigSignatureA.subsignatures.map((s1, index) => {\n const s2 = multisigSignatureB.subsignatures[index]\n return {\n publicKey: s1.publicKey,\n signature: s2.signature || s1.signature, // Prefer s2, fall back to s1\n }\n })\n\n return {\n version: multisigSignatureA.version,\n threshold: multisigSignatureA.threshold,\n subsignatures: mergedSubsignatures,\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\nexport const MULTISIG_MERGE_LESSTHANTWO_ERROR_MSG = 'Not enough multisig transactions to merge. Need at least two'\nexport const MULTISIG_MERGE_MISMATCH_ERROR_MSG = 'Cannot merge txs. txIDs differ'\nexport const MULTISIG_MERGE_MISMATCH_AUTH_ADDR_MSG = 'Cannot merge txs. Auth addrs differ'\nexport const MULTISIG_MERGE_WRONG_PREIMAGE_ERROR_MSG = 'Cannot merge txs. Multisig preimages differ'\nexport const MULTISIG_MERGE_SIG_MISMATCH_ERROR_MSG = 'Cannot merge txs. subsigs are mismatched.'\nexport const MULTISIG_NO_MUTATE_ERROR_MSG = 'Cannot mutate a multisig field as it would invalidate all existing signatures.'\nexport const MULTISIG_USE_PARTIAL_SIGN_ERROR_MSG = 'Cannot sign a multisig transaction using `signTxn`. Use `partialSignTxn` instead.'\nexport const 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 */\nexport function createMultisigTransaction(txn: Transaction, { version, threshold, addrs }: MultisigMetadata) {\n // construct the appendable multisigned transaction format\n const pks = toPublicKeys(addrs)\n const subsignatures: MultisigSubsignature[] = pks.map((pk) => ({\n publicKey: pk,\n signature: undefined,\n }))\n\n const msig: MultisigSignature = {\n version,\n threshold,\n 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 encodeSignedTransaction(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): Uint8Array {\n // Create an empty encoded multisig transaction\n const encodedMsig = createMultisigTransaction(txn, {\n version,\n threshold,\n addrs: publicKeys.map((pk) => new Address(pk)),\n })\n // note: this is not signed yet, but will be shortly\n const signedTxn = decodeSignedTransaction(encodedMsig)\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!.subsignatures.map((subsig) => {\n if (arrayEqual(subsig.publicKey, myPk)) {\n keyExist = true\n return { ...subsig, signature: 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 subsignatures: updatedSubsigs,\n },\n }\n\n return encodeSignedTransaction(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 */\nexport function mergeMultisigTransactions(multisigTxnBlobs: Uint8Array[]) {\n if (multisigTxnBlobs.length < 2) {\n throw new Error(MULTISIG_MERGE_LESSTHANTWO_ERROR_MSG)\n }\n const refSigTx = decodeSignedTransaction(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.subsignatures.map((subsig) => subsig.publicKey),\n }\n const refMsigAddr = addressFromMultisigPreImg(refPreImage)\n\n const newSubsigs: MultisigSubsignature[] = refSigTx.msig.subsignatures.map((sig) => ({ ...sig }))\n for (let i = 1; i < multisigTxnBlobs.length; i++) {\n const unisig = decodeSignedTransaction(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.subsignatures.length !== refSigTx.msig.subsignatures.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.subsignatures.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.subsignatures.forEach((uniSubsig, index) => {\n if (!uniSubsig.signature) return\n const current = newSubsigs[index]\n if (current.signature && !arrayEqual(uniSubsig.signature, current.signature)) {\n // mismatch\n throw new Error(MULTISIG_MERGE_SIG_MISMATCH_ERROR_MSG)\n }\n current.signature = uniSubsig.signature\n })\n }\n\n const msig: MultisigSignature = {\n version: refSigTx.msig.version,\n threshold: refSigTx.msig.threshold,\n subsignatures: newSubsigs,\n }\n\n const signedTxn: SignedTransaction = {\n txn: refSigTx.txn,\n msig: msig,\n authAddress: refAuthAddr,\n }\n\n return encodeSignedTransaction(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 */\nexport function appendSignRawMultisigSignature(\n multisigTxnBlob: Uint8Array,\n { version, threshold, addrs }: MultisigMetadata,\n signerAddr: string | Address,\n signature: Uint8Array,\n) {\n const publicKeys = toPublicKeys(addrs)\n // obtain underlying txn, sign it, and merge it\n const multisigTxObj = decodeSignedTransaction(multisigTxnBlob)\n const partialSignedBlob = partialSignWithMultisigSignature(multisigTxObj.txn, { version, threshold, publicKeys }, signerAddr, signature)\n return {\n txID: multisigTxObj.txn.txId(),\n blob: mergeMultisigTransactions([multisigTxnBlob, partialSignedBlob]),\n }\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 */\nexport function 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 */\nexport function 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 */\nexport const 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 {\n _params: MultisigMetadata\n _subSigners: (AddressWithTransactionSigner & AddressWithDelegatedLsigSigner)[]\n _addr: Address\n _signer: TransactionSigner\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 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: Uint8Array[] = []\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).blob\n }\n\n signedMsigTxns.push(signedMsigTxn)\n }\n\n return signedMsigTxns\n }\n }\n}\n/**\n * Decodes MsgPack bytes into a multi signature.\n *\n * @param encodedMultiSignature - The MsgPack encoded multi signature\n * @returns The decoded MultisigSignature or an error if decoding fails.\n */\nexport function decodeMultiSignature(encodedMultiSignature: Uint8Array): MultisigSignature {\n const decodedData = decodeMsgpack(encodedMultiSignature)\n return multiSignatureCodec.decode(decodedData, 'msgpack')\n}\n"],"mappings":"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"}
@@ -34,7 +34,7 @@ function addressFromMultisigSignature(multisigSignature) {
34
34
  return addressFromMultisigPreImg({
35
35
  version: multisigSignature.version,
36
36
  threshold: multisigSignature.threshold,
37
- pks: multisigSignature.subsignatures.map((subsig) => subsig.publicKey)
37
+ publicKeys: multisigSignature.subsignatures.map((subsig) => subsig.publicKey)
38
38
  });
39
39
  }
40
40
  /**
@@ -132,7 +132,7 @@ function createMultisigTransaction(txn, { version, threshold, addrs }) {
132
132
  const msigAddr = addressFromMultisigPreImg({
133
133
  version,
134
134
  threshold,
135
- pks
135
+ publicKeys: pks
136
136
  });
137
137
  let authAddress;
138
138
  if (!msigAddr.equals(txn.sender)) authAddress = msigAddr;
@@ -152,11 +152,11 @@ function createMultisigTransaction(txn, { version, threshold, addrs }) {
152
152
  * @param pks - ordered list of public keys in this multisig
153
153
  * @returns encoded multisig blob
154
154
  */
155
- function createMultisigTransactionWithSignature(txn, { rawSig, myPk }, { version, threshold, pks }) {
155
+ function createMultisigTransactionWithSignature(txn, { rawSig, myPk }, { version, threshold, publicKeys }) {
156
156
  const signedTxn = decodeSignedTransaction(createMultisigTransaction(txn, {
157
157
  version,
158
158
  threshold,
159
- addrs: pks.map((pk) => new Address(pk))
159
+ addrs: publicKeys.map((pk) => new Address(pk))
160
160
  }));
161
161
  let keyExist = false;
162
162
  const updatedSubsigs = signedTxn.msig.subsignatures.map((subsig) => {
@@ -192,7 +192,7 @@ function mergeMultisigTransactions(multisigTxnBlobs) {
192
192
  const refMsigAddr = addressFromMultisigPreImg({
193
193
  version: refSigTx.msig.version,
194
194
  threshold: refSigTx.msig.threshold,
195
- pks: refSigTx.msig.subsignatures.map((subsig) => subsig.publicKey)
195
+ publicKeys: refSigTx.msig.subsignatures.map((subsig) => subsig.publicKey)
196
196
  });
197
197
  const newSubsigs = refSigTx.msig.subsignatures.map((sig) => ({ ...sig }));
198
198
  for (let i = 1; i < multisigTxnBlobs.length; i++) {
@@ -204,7 +204,7 @@ function mergeMultisigTransactions(multisigTxnBlobs) {
204
204
  const msgigAddr = addressFromMultisigPreImg({
205
205
  version: unisig.msig.version,
206
206
  threshold: unisig.msig.threshold,
207
- pks: unisig.msig.subsignatures.map((subsig) => subsig.publicKey)
207
+ publicKeys: unisig.msig.subsignatures.map((subsig) => subsig.publicKey)
208
208
  });
209
209
  if (refMsigAddr.toString() !== msgigAddr.toString()) throw new Error(MULTISIG_MERGE_WRONG_PREIMAGE_ERROR_MSG);
210
210
  unisig.msig.subsignatures.forEach((uniSubsig, index) => {
@@ -252,12 +252,12 @@ function partialSignWithMultisigSignature(transaction, metadata, signerAddr, sig
252
252
  * @returns object containing txID, and blob representing encoded multisig txn
253
253
  */
254
254
  function appendSignRawMultisigSignature(multisigTxnBlob, { version, threshold, addrs }, signerAddr, signature) {
255
- const pks = toPublicKeys(addrs);
255
+ const publicKeys = toPublicKeys(addrs);
256
256
  const multisigTxObj = decodeSignedTransaction(multisigTxnBlob);
257
257
  const partialSignedBlob = partialSignWithMultisigSignature(multisigTxObj.txn, {
258
258
  version,
259
259
  threshold,
260
- pks
260
+ publicKeys
261
261
  }, signerAddr, signature);
262
262
  return {
263
263
  txID: multisigTxObj.txn.txId(),
@@ -273,18 +273,18 @@ function appendSignRawMultisigSignature(multisigTxnBlob, { version, threshold, a
273
273
  * @param threshold - multisig threshold
274
274
  * @param pks - array of typed array public keys
275
275
  */
276
- function addressFromMultisigPreImg({ version, threshold, pks }) {
276
+ function addressFromMultisigPreImg({ version, threshold, publicKeys }) {
277
277
  if (version > 255 || version < 0) throw new Error(`${INVALID_MSIG_VERSION_ERROR_MSG}: ${version}`);
278
- if (threshold === 0 || pks.length === 0 || threshold > pks.length || threshold > 255) throw new Error(INVALID_MSIG_THRESHOLD_ERROR_MSG);
278
+ if (threshold === 0 || publicKeys.length === 0 || threshold > publicKeys.length || threshold > 255) throw new Error(INVALID_MSIG_THRESHOLD_ERROR_MSG);
279
279
  const pkLen = ALGORAND_ADDRESS_BYTE_LENGTH - ALGORAND_CHECKSUM_BYTE_LENGTH;
280
280
  if (pkLen !== PUBLIC_KEY_BYTE_LENGTH) throw new Error(UNEXPECTED_PK_LEN_ERROR_MSG);
281
- const merged = new Uint8Array(MULTISIG_PREIMG2ADDR_PREFIX.length + 2 + pkLen * pks.length);
281
+ const merged = new Uint8Array(MULTISIG_PREIMG2ADDR_PREFIX.length + 2 + pkLen * publicKeys.length);
282
282
  merged.set(MULTISIG_PREIMG2ADDR_PREFIX, 0);
283
283
  merged.set([version], MULTISIG_PREIMG2ADDR_PREFIX.length);
284
284
  merged.set([threshold], MULTISIG_PREIMG2ADDR_PREFIX.length + 1);
285
- for (let i = 0; i < pks.length; i++) {
286
- if (pks[i].length !== pkLen) throw new Error(INVALID_MSIG_PK_ERROR_MSG);
287
- merged.set(pks[i], MULTISIG_PREIMG2ADDR_PREFIX.length + 2 + i * pkLen);
285
+ for (let i = 0; i < publicKeys.length; i++) {
286
+ if (publicKeys[i].length !== pkLen) throw new Error(INVALID_MSIG_PK_ERROR_MSG);
287
+ merged.set(publicKeys[i], MULTISIG_PREIMG2ADDR_PREFIX.length + 2 + i * pkLen);
288
288
  }
289
289
  return new Address(Uint8Array.from(hash(merged)));
290
290
  }
@@ -299,7 +299,7 @@ function addressFromMultisigPreImgAddrs({ version, threshold, addrs }) {
299
299
  return addressFromMultisigPreImg({
300
300
  version,
301
301
  threshold,
302
- pks: toPublicKeys(addrs)
302
+ publicKeys: toPublicKeys(addrs)
303
303
  });
304
304
  }
305
305
  /**