@alephium/web3 0.39.3 → 0.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1007,7 +1007,7 @@ export declare class HttpClient<SecurityDataType = unknown> {
1007
1007
  }
1008
1008
  /**
1009
1009
  * @title Alephium API
1010
- * @version 2.11.0
1010
+ * @version 2.14.0
1011
1011
  * @baseUrl ../
1012
1012
  */
1013
1013
  export declare class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDataType> {
@@ -151,7 +151,7 @@ class HttpClient {
151
151
  exports.HttpClient = HttpClient;
152
152
  /**
153
153
  * @title Alephium API
154
- * @version 2.11.0
154
+ * @version 2.14.0
155
155
  * @baseUrl ../
156
156
  */
157
157
  class Api extends HttpClient {
@@ -170,6 +170,7 @@ export declare const AddModN: Instr;
170
170
  export declare const U256ToString: Instr;
171
171
  export declare const I256ToString: Instr;
172
172
  export declare const BoolToString: Instr;
173
+ export declare const GroupOfAddress: Instr;
173
174
  export declare const LoadMutField: (index: number) => Instr;
174
175
  export declare const StoreMutField: (index: number) => Instr;
175
176
  export declare const ApproveAlph: Instr;
@@ -221,6 +222,8 @@ export declare const LoadImmFieldByIndex: Instr;
221
222
  export declare const PayGasFee: Instr;
222
223
  export declare const MinimalContractDeposit: Instr;
223
224
  export declare const CreateMapEntry: (immFields: number, mutFields: number) => Instr;
225
+ export declare const MethodSelector: (selector: number) => Instr;
226
+ export declare const CallExternalBySelector: (selector: number) => Instr;
224
227
  export declare class InstrCodec implements Codec<Instr> {
225
228
  parser: Parser;
226
229
  encode(instr: Instr): Buffer;
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.U256Lt = exports.U256Neq = exports.U256Eq = exports.U256Mod = exports.U256Div = exports.U256Mul = exports.U256Sub = exports.U256Add = exports.I256Ge = exports.I256Gt = exports.I256Le = exports.I256Lt = exports.I256Neq = exports.I256Eq = exports.I256Mod = exports.I256Div = exports.I256Mul = exports.I256Sub = exports.I256Add = exports.BoolToByteVec = exports.BoolNeq = exports.BoolEq = exports.BoolOr = exports.BoolAnd = exports.BoolNot = exports.Pop = exports.StoreLocal = exports.LoadLocal = exports.AddressConst = exports.ByteConst = exports.U256Const = exports.I256Const = exports.U256Const5 = exports.U256Const4 = exports.U256Const3 = exports.U256Const2 = exports.U256Const1 = exports.U256Const0 = exports.I256ConstN1 = exports.I256Const5 = exports.I256Const4 = exports.I256Const3 = exports.I256Const2 = exports.I256Const1 = exports.I256Const0 = exports.ConstFalse = exports.ConstTrue = exports.Return = exports.CallExternal = exports.CallLocal = void 0;
4
4
  exports.ByteVecToAddress = exports.ByteVecSlice = exports.Log5 = exports.Log4 = exports.Log3 = exports.Log2 = exports.Log1 = exports.VerifyRelativeLocktime = exports.VerifyAbsoluteLocktime = exports.TxInputsSize = exports.TxInputAddressAt = exports.TxId = exports.BlockTarget = exports.BlockTimeStamp = exports.NetworkId = exports.VerifyED25519 = exports.VerifySecP256K1 = exports.VerifyTxSignature = exports.Sha3 = exports.Sha256 = exports.Keccak256 = exports.Blake2b = exports.Assert = exports.IfFalse = exports.IfTrue = exports.Jump = exports.IsContractAddress = exports.IsAssetAddress = exports.AddressToByteVec = exports.AddressNeq = exports.AddressEq = exports.ByteVecConcat = exports.ByteVecSize = exports.ByteVecNeq = exports.ByteVecEq = exports.U256ToByteVec = exports.U256ToI256 = exports.I256ToByteVec = exports.I256ToU256 = exports.U256SHR = exports.U256SHL = exports.U256Xor = exports.U256BitOr = exports.U256BitAnd = exports.U256ModMul = exports.U256ModSub = exports.U256ModAdd = exports.U256Ge = exports.U256Gt = exports.U256Le = void 0;
5
- exports.TransferAlphToSelf = exports.TransferAlphFromSelf = exports.TransferAlph = exports.IsPaying = exports.TokenRemaining = exports.AlphRemaining = exports.ApproveToken = exports.ApproveAlph = exports.StoreMutField = exports.LoadMutField = exports.BoolToString = exports.I256ToString = exports.U256ToString = exports.AddModN = exports.MulModN = exports.GetSegragatedSignature = exports.VerifyBIP340Schnorr = exports.U256ModExp = exports.U256Exp = exports.I256Exp = exports.TxGasFee = exports.TxGasAmount = exports.TxGasPrice = exports.DEBUG = exports.BlockHash = exports.Swap = exports.AssertWithErrorCode = exports.Dup = exports.StoreLocalByIndex = exports.LoadLocalByIndex = exports.ContractIdToAddress = exports.Log9 = exports.Log8 = exports.Log7 = exports.Log6 = exports.EthEcRecover = exports.U256From32Byte = exports.U256From16Byte = exports.U256From8Byte = exports.U256From4Byte = exports.U256From2Byte = exports.U256From1Byte = exports.U256To32Byte = exports.U256To16Byte = exports.U256To8Byte = exports.U256To4Byte = exports.U256To2Byte = exports.U256To1Byte = exports.Zeros = exports.Encode = void 0;
6
- exports.instrsCodec = exports.instrCodec = exports.InstrCodec = exports.CreateMapEntry = exports.MinimalContractDeposit = exports.PayGasFee = exports.LoadImmFieldByIndex = exports.LoadImmField = exports.AlphTokenId = exports.SubContractIdOf = exports.SubContractId = exports.NullContractAddress = exports.CopyCreateSubContractAndTransferToken = exports.CreateSubContractAndTransferToken = exports.CopyCreateContractAndTransferToken = exports.CreateContractAndTransferToken = exports.ContractExists = exports.StoreMutFieldByIndex = exports.LoadMutFieldByIndex = exports.CopyCreateSubContractWithToken = exports.CopyCreateSubContract = exports.CreateSubContractWithToken = exports.CreateSubContract = exports.LockApprovedAssets = exports.BurnToken = exports.CopyCreateContractWithToken = exports.MigrateWithFields = exports.MigrateSimple = exports.ContractInitialCodeHash = exports.ContractInitialStateHash = exports.CallerCodeHash = exports.CallerInitialStateHash = exports.IsCallerFromTxScript = exports.CallerAddress = exports.CallerContractId = exports.SelfAddress = exports.SelfContractId = exports.DestroySelf = exports.CopyCreateContract = exports.CreateContractWithToken = exports.CreateContract = exports.TransferTokenToSelf = exports.TransferTokenFromSelf = exports.TransferToken = void 0;
5
+ exports.TransferAlphFromSelf = exports.TransferAlph = exports.IsPaying = exports.TokenRemaining = exports.AlphRemaining = exports.ApproveToken = exports.ApproveAlph = exports.StoreMutField = exports.LoadMutField = exports.GroupOfAddress = exports.BoolToString = exports.I256ToString = exports.U256ToString = exports.AddModN = exports.MulModN = exports.GetSegragatedSignature = exports.VerifyBIP340Schnorr = exports.U256ModExp = exports.U256Exp = exports.I256Exp = exports.TxGasFee = exports.TxGasAmount = exports.TxGasPrice = exports.DEBUG = exports.BlockHash = exports.Swap = exports.AssertWithErrorCode = exports.Dup = exports.StoreLocalByIndex = exports.LoadLocalByIndex = exports.ContractIdToAddress = exports.Log9 = exports.Log8 = exports.Log7 = exports.Log6 = exports.EthEcRecover = exports.U256From32Byte = exports.U256From16Byte = exports.U256From8Byte = exports.U256From4Byte = exports.U256From2Byte = exports.U256From1Byte = exports.U256To32Byte = exports.U256To16Byte = exports.U256To8Byte = exports.U256To4Byte = exports.U256To2Byte = exports.U256To1Byte = exports.Zeros = exports.Encode = void 0;
6
+ exports.instrsCodec = exports.instrCodec = exports.InstrCodec = exports.CallExternalBySelector = exports.MethodSelector = exports.CreateMapEntry = exports.MinimalContractDeposit = exports.PayGasFee = exports.LoadImmFieldByIndex = exports.LoadImmField = exports.AlphTokenId = exports.SubContractIdOf = exports.SubContractId = exports.NullContractAddress = exports.CopyCreateSubContractAndTransferToken = exports.CreateSubContractAndTransferToken = exports.CopyCreateContractAndTransferToken = exports.CreateContractAndTransferToken = exports.ContractExists = exports.StoreMutFieldByIndex = exports.LoadMutFieldByIndex = exports.CopyCreateSubContractWithToken = exports.CopyCreateSubContract = exports.CreateSubContractWithToken = exports.CreateSubContract = exports.LockApprovedAssets = exports.BurnToken = exports.CopyCreateContractWithToken = exports.MigrateWithFields = exports.MigrateSimple = exports.ContractInitialCodeHash = exports.ContractInitialStateHash = exports.CallerCodeHash = exports.CallerInitialStateHash = exports.IsCallerFromTxScript = exports.CallerAddress = exports.CallerContractId = exports.SelfAddress = exports.SelfContractId = exports.DestroySelf = exports.CopyCreateContract = exports.CreateContractWithToken = exports.CreateContract = exports.TransferTokenToSelf = exports.TransferTokenFromSelf = exports.TransferToken = exports.TransferAlphToSelf = void 0;
7
7
  /*
8
8
  Copyright 2018 - 2022 The Alephium Authors
9
9
  This file is part of the alephium project.
@@ -27,6 +27,7 @@ const array_codec_1 = require("./array-codec");
27
27
  const compact_int_codec_1 = require("./compact-int-codec");
28
28
  const bytestring_codec_1 = require("./bytestring-codec");
29
29
  const lockup_script_codec_1 = require("./lockup-script-codec");
30
+ const signed_int_codec_1 = require("./signed-int-codec");
30
31
  const byteStringArrayCodec = new array_codec_1.ArrayCodec(bytestring_codec_1.byteStringCodec);
31
32
  const CallLocal = (index) => ({ code: 0x00, value: { index } });
32
33
  exports.CallLocal = CallLocal;
@@ -180,6 +181,7 @@ exports.AddModN = { code: 0x88, value: {} };
180
181
  exports.U256ToString = { code: 0x89, value: {} };
181
182
  exports.I256ToString = { code: 0x8a, value: {} };
182
183
  exports.BoolToString = { code: 0x8b, value: {} };
184
+ exports.GroupOfAddress = { code: 0x8c, value: {} };
183
185
  const LoadMutField = (index) => ({ code: 0xa0, value: { index } });
184
186
  exports.LoadMutField = LoadMutField;
185
187
  const StoreMutField = (index) => ({ code: 0xa1, value: { index } });
@@ -235,6 +237,14 @@ exports.PayGasFee = { code: 0xd0, value: {} };
235
237
  exports.MinimalContractDeposit = { code: 0xd1, value: {} };
236
238
  const CreateMapEntry = (immFields, mutFields) => ({ code: 0xd2, value: { immFields, mutFields } });
237
239
  exports.CreateMapEntry = CreateMapEntry;
240
+ const MethodSelector = (selector) => {
241
+ return { code: 0xd3, value: { index: selector } };
242
+ };
243
+ exports.MethodSelector = MethodSelector;
244
+ const CallExternalBySelector = (selector) => {
245
+ return { code: 0xd4, value: { index: selector } };
246
+ };
247
+ exports.CallExternalBySelector = CallExternalBySelector;
238
248
  class InstrCodec {
239
249
  constructor() {
240
250
  this.parser = binary_parser_1.Parser.start()
@@ -382,6 +392,7 @@ class InstrCodec {
382
392
  [exports.U256ToString.code]: binary_parser_1.Parser.start(),
383
393
  [exports.I256ToString.code]: binary_parser_1.Parser.start(),
384
394
  [exports.BoolToString.code]: binary_parser_1.Parser.start(),
395
+ [exports.GroupOfAddress.code]: binary_parser_1.Parser.start(),
385
396
  0xa0: binary_parser_1.Parser.start().uint8('index'),
386
397
  0xa1: binary_parser_1.Parser.start().uint8('index'),
387
398
  [exports.ApproveAlph.code]: binary_parser_1.Parser.start(),
@@ -432,7 +443,9 @@ class InstrCodec {
432
443
  [exports.LoadImmFieldByIndex.code]: binary_parser_1.Parser.start(),
433
444
  [exports.PayGasFee.code]: binary_parser_1.Parser.start(),
434
445
  [exports.MinimalContractDeposit.code]: binary_parser_1.Parser.start(),
435
- 0xd2: binary_parser_1.Parser.start().uint8('immFields').uint8('mutFields')
446
+ 0xd2: binary_parser_1.Parser.start().uint8('immFields').uint8('mutFields'),
447
+ 0xd3: binary_parser_1.Parser.start().int32('index'),
448
+ 0xd4: binary_parser_1.Parser.start().int32('index')
436
449
  }
437
450
  });
438
451
  }
@@ -460,6 +473,9 @@ class InstrCodec {
460
473
  const value = instrValue;
461
474
  result.push(value.immFields, value.mutFields);
462
475
  }
476
+ else if (instr.code === 0xd3 || instr.code === 0xd4) {
477
+ result.push(...signed_int_codec_1.signedIntCodec.encode(instrValue.index));
478
+ }
463
479
  return buffer_1.Buffer.from(result);
464
480
  }
465
481
  decode(input) {
@@ -321,6 +321,15 @@ export declare function addStdIdToFields<F extends Fields>(contract: Contract, f
321
321
  __stdInterfaceId: HexString;
322
322
  });
323
323
  export declare function testMethod<I extends ContractInstance, F extends Fields, A extends Arguments, R, M extends Record<string, Map<Val, Val>> = Record<string, Map<Val, Val>>>(factory: ContractFactory<I, F>, methodName: string, params: Optional<TestContractParams<F, A, M>, 'testArgs' | 'initialFields'>): Promise<TestContractResult<R, M>>;
324
+ export declare class RalphMap<K extends Val, V extends Val> {
325
+ private readonly parentContract;
326
+ private readonly parentInstance;
327
+ private readonly mapName;
328
+ constructor(parentContract: Contract, parentInstance: ContractInstance, mapName: string);
329
+ get(key: K): Promise<V | undefined>;
330
+ contains(key: K): Promise<boolean>;
331
+ }
332
+ export declare function getMapItem<R extends Val>(parentContract: Contract, parentInstance: ContractInstance, mapName: string, key: Val): Promise<R | undefined>;
324
333
  export declare abstract class ContractInstance {
325
334
  readonly address: Address;
326
335
  readonly contractId: string;
@@ -43,7 +43,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
43
43
  return (mod && mod.__esModule) ? mod : { "default": mod };
44
44
  };
45
45
  Object.defineProperty(exports, "__esModule", { value: true });
46
- exports.tryGetCallResult = exports.getTokenIdFromUnsignedTx = exports.getContractIdFromUnsignedTx = exports.getContractEventsCurrentCount = exports.multicallMethods = exports.callMethod = exports.subscribeContractEvents = exports.subscribeContractEvent = exports.decodeEvent = exports.subscribeContractDestroyedEvent = exports.subscribeContractCreatedEvent = exports.fetchContractState = exports.ContractInstance = exports.testMethod = exports.addStdIdToFields = exports.subscribeEventsFromContract = exports.decodeContractDestroyedEvent = exports.decodeContractCreatedEvent = exports.DestroyContractEventAddresses = exports.CreateContractEventAddresses = exports.ExecutableScript = exports.ContractFactory = exports.randomTxId = exports.fromApiEventFields = exports.fromApiArray = exports.getDefaultValue = exports.fromApiFields = exports.Script = exports.Contract = exports.Artifact = exports.Project = exports.Struct = exports.ProjectArtifact = exports.DEFAULT_COMPILER_OPTIONS = exports.DEFAULT_NODE_COMPILER_OPTIONS = exports.StdIdFieldName = void 0;
46
+ exports.tryGetCallResult = exports.getTokenIdFromUnsignedTx = exports.getContractIdFromUnsignedTx = exports.getContractEventsCurrentCount = exports.multicallMethods = exports.callMethod = exports.subscribeContractEvents = exports.subscribeContractEvent = exports.decodeEvent = exports.subscribeContractDestroyedEvent = exports.subscribeContractCreatedEvent = exports.fetchContractState = exports.ContractInstance = exports.getMapItem = exports.RalphMap = exports.testMethod = exports.addStdIdToFields = exports.subscribeEventsFromContract = exports.decodeContractDestroyedEvent = exports.decodeContractCreatedEvent = exports.DestroyContractEventAddresses = exports.CreateContractEventAddresses = exports.ExecutableScript = exports.ContractFactory = exports.randomTxId = exports.fromApiEventFields = exports.fromApiArray = exports.getDefaultValue = exports.fromApiFields = exports.Script = exports.Contract = exports.Artifact = exports.Project = exports.Struct = exports.ProjectArtifact = exports.DEFAULT_COMPILER_OPTIONS = exports.DEFAULT_NODE_COMPILER_OPTIONS = exports.StdIdFieldName = void 0;
47
47
  const buffer_1 = require("buffer/");
48
48
  const fs_1 = __importDefault(require("fs"));
49
49
  const fs_2 = require("fs");
@@ -1321,6 +1321,44 @@ async function testMethod(factory, methodName, params) {
1321
1321
  };
1322
1322
  }
1323
1323
  exports.testMethod = testMethod;
1324
+ class RalphMap {
1325
+ constructor(parentContract, parentInstance, mapName) {
1326
+ this.parentContract = parentContract;
1327
+ this.parentInstance = parentInstance;
1328
+ this.mapName = mapName;
1329
+ }
1330
+ async get(key) {
1331
+ return getMapItem(this.parentContract, this.parentInstance, this.mapName, key);
1332
+ }
1333
+ async contains(key) {
1334
+ return this.get(key).then((v) => v !== undefined);
1335
+ }
1336
+ }
1337
+ exports.RalphMap = RalphMap;
1338
+ async function getMapItem(parentContract, parentInstance, mapName, key) {
1339
+ const index = parentContract.mapsSig?.names.findIndex((name) => name === mapName);
1340
+ const mapType = index === undefined ? undefined : parentContract.mapsSig?.types[`${index}`];
1341
+ if (mapType === undefined) {
1342
+ throw new Error(`Map ${mapName} does not exist in contract ${parentContract.name}`);
1343
+ }
1344
+ const [keyType, valueType] = ralph.parseMapType(mapType);
1345
+ const mapItemContractId = calcWrapperContractId(parentInstance.contractId, index, key, keyType, parentInstance.groupIndex);
1346
+ const mapItemAddress = (0, utils_1.addressFromContractId)(mapItemContractId);
1347
+ try {
1348
+ const state = await (0, global_1.getCurrentNodeProvider)().contracts.getContractsAddressState(mapItemAddress);
1349
+ const fieldsSig = getContractFieldsSig(valueType);
1350
+ const fields = fromApiFields(state.immFields, state.mutFields, fieldsSig, parentContract.structs);
1351
+ return fields['value'];
1352
+ }
1353
+ catch (error) {
1354
+ if (error instanceof Error && error.message.includes('KeyNotFound')) {
1355
+ // the map item contract does not exist
1356
+ return undefined;
1357
+ }
1358
+ throw error;
1359
+ }
1360
+ }
1361
+ exports.getMapItem = getMapItem;
1324
1362
  function buildMapInfo(contract, fields) {
1325
1363
  const mapsSig = contract.mapsSig;
1326
1364
  if (mapsSig === undefined)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alephium/web3",
3
- "version": "0.39.3",
3
+ "version": "0.40.0",
4
4
  "description": "A JS/TS library to interact with the Alephium platform",
5
5
  "license": "GPL",
6
6
  "main": "dist/src/index.js",
@@ -27,7 +27,7 @@
27
27
  },
28
28
  "author": "Alephium dev <dev@alephium.org>",
29
29
  "config": {
30
- "alephium_version": "2.11.0",
30
+ "alephium_version": "2.14.0",
31
31
  "explorer_backend_version": "1.17.0"
32
32
  },
33
33
  "type": "commonjs",
@@ -90,7 +90,7 @@
90
90
  "build": "rm -rf dist/* && npx tsc --build . && webpack",
91
91
  "test": "jest -i --config ./jest-config.json",
92
92
  "update-schemas": "npm run update-schema:alephium && npm run update-schema:explorer",
93
- "update-schema:alephium": "npx swagger-typescript-api --disable-throw-on-error -t ./configs -o ./src/api -n api-alephium.ts -p https://raw.githubusercontent.com/alephium/alephium/rhone-upgrade/api/src/main/resources/openapi.json",
93
+ "update-schema:alephium": "npx swagger-typescript-api --disable-throw-on-error -t ./configs -o ./src/api -n api-alephium.ts -p https://raw.githubusercontent.com/alephium/alephium/v${npm_package_config_alephium_version}/api/src/main/resources/openapi.json",
94
94
  "update-schema:explorer": "npx swagger-typescript-api --disable-throw-on-error -t ./configs -o ./src/api -n api-explorer.ts -p https://raw.githubusercontent.com/alephium/explorer-backend/v${npm_package_config_explorer_backend_version}/app/src/main/resources/explorer-backend-openapi.json",
95
95
  "check-versions": "node scripts/check-versions.js ${npm_package_config_alephium_version} ${npm_package_config_explorer_backend_version}"
96
96
  }
@@ -1306,7 +1306,7 @@ export class HttpClient<SecurityDataType = unknown> {
1306
1306
 
1307
1307
  /**
1308
1308
  * @title Alephium API
1309
- * @version 2.11.0
1309
+ * @version 2.14.0
1310
1310
  * @baseUrl ../
1311
1311
  */
1312
1312
  export class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDataType> {
@@ -22,6 +22,7 @@ import { compactUnsignedIntCodec, compactSignedIntCodec, DecodedCompactInt } fro
22
22
  import { ByteString, byteStringCodec } from './bytestring-codec'
23
23
  import { LockupScript, lockupScriptCodec } from './lockup-script-codec'
24
24
  import { Codec } from './codec'
25
+ import { signedIntCodec } from './signed-int-codec'
25
26
 
26
27
  const byteStringArrayCodec = new ArrayCodec(byteStringCodec)
27
28
 
@@ -192,6 +193,7 @@ export const AddModN: Instr = { code: 0x88, value: {} }
192
193
  export const U256ToString: Instr = { code: 0x89, value: {} }
193
194
  export const I256ToString: Instr = { code: 0x8a, value: {} }
194
195
  export const BoolToString: Instr = { code: 0x8b, value: {} }
196
+ export const GroupOfAddress: Instr = { code: 0x8c, value: {} }
195
197
  export const LoadMutField = (index: number): Instr => ({ code: 0xa0, value: { index } })
196
198
  export const StoreMutField = (index: number): Instr => ({ code: 0xa1, value: { index } })
197
199
  export const ApproveAlph: Instr = { code: 0xa2, value: {} }
@@ -246,6 +248,12 @@ export const CreateMapEntry: (immFields: number, mutFields: number) => Instr = (
246
248
  immFields: number,
247
249
  mutFields: number
248
250
  ) => ({ code: 0xd2, value: { immFields, mutFields } })
251
+ export const MethodSelector: (selector: number) => Instr = (selector: number) => {
252
+ return { code: 0xd3, value: { index: selector } }
253
+ }
254
+ export const CallExternalBySelector: (selector: number) => Instr = (selector: number) => {
255
+ return { code: 0xd4, value: { index: selector } }
256
+ }
249
257
 
250
258
  export class InstrCodec implements Codec<Instr> {
251
259
  parser = Parser.start()
@@ -393,6 +401,7 @@ export class InstrCodec implements Codec<Instr> {
393
401
  [U256ToString.code]: Parser.start(),
394
402
  [I256ToString.code]: Parser.start(),
395
403
  [BoolToString.code]: Parser.start(),
404
+ [GroupOfAddress.code]: Parser.start(),
396
405
  0xa0: Parser.start().uint8('index'),
397
406
  0xa1: Parser.start().uint8('index'),
398
407
  [ApproveAlph.code]: Parser.start(),
@@ -443,7 +452,9 @@ export class InstrCodec implements Codec<Instr> {
443
452
  [LoadImmFieldByIndex.code]: Parser.start(),
444
453
  [PayGasFee.code]: Parser.start(),
445
454
  [MinimalContractDeposit.code]: Parser.start(),
446
- 0xd2: Parser.start().uint8('immFields').uint8('mutFields')
455
+ 0xd2: Parser.start().uint8('immFields').uint8('mutFields'),
456
+ 0xd3: Parser.start().int32('index'),
457
+ 0xd4: Parser.start().int32('index')
447
458
  }
448
459
  })
449
460
 
@@ -465,6 +476,8 @@ export class InstrCodec implements Codec<Instr> {
465
476
  } else if (instr.code === 0xd2) {
466
477
  const value = instrValue as CreateMapEntryValue
467
478
  result.push(value.immFields, value.mutFields)
479
+ } else if (instr.code === 0xd3 || instr.code === 0xd4) {
480
+ result.push(...signedIntCodec.encode((instrValue as InstrValueWithIndex).index))
468
481
  }
469
482
 
470
483
  return Buffer.from(result)
@@ -2007,6 +2007,56 @@ export async function testMethod<
2007
2007
  } as TestContractResult<R, M>
2008
2008
  }
2009
2009
 
2010
+ export class RalphMap<K extends Val, V extends Val> {
2011
+ constructor(
2012
+ private readonly parentContract: Contract,
2013
+ private readonly parentInstance: ContractInstance,
2014
+ private readonly mapName: string
2015
+ ) {}
2016
+
2017
+ async get(key: K): Promise<V | undefined> {
2018
+ return getMapItem(this.parentContract, this.parentInstance, this.mapName, key)
2019
+ }
2020
+
2021
+ async contains(key: K): Promise<boolean> {
2022
+ return this.get(key).then((v) => v !== undefined)
2023
+ }
2024
+ }
2025
+
2026
+ export async function getMapItem<R extends Val>(
2027
+ parentContract: Contract,
2028
+ parentInstance: ContractInstance,
2029
+ mapName: string,
2030
+ key: Val
2031
+ ): Promise<R | undefined> {
2032
+ const index = parentContract.mapsSig?.names.findIndex((name) => name === mapName)
2033
+ const mapType = index === undefined ? undefined : parentContract.mapsSig?.types[`${index}`]
2034
+ if (mapType === undefined) {
2035
+ throw new Error(`Map ${mapName} does not exist in contract ${parentContract.name}`)
2036
+ }
2037
+ const [keyType, valueType] = ralph.parseMapType(mapType)
2038
+ const mapItemContractId = calcWrapperContractId(
2039
+ parentInstance.contractId,
2040
+ index!,
2041
+ key,
2042
+ keyType,
2043
+ parentInstance.groupIndex
2044
+ )
2045
+ const mapItemAddress = addressFromContractId(mapItemContractId)
2046
+ try {
2047
+ const state = await getCurrentNodeProvider().contracts.getContractsAddressState(mapItemAddress)
2048
+ const fieldsSig = getContractFieldsSig(valueType)
2049
+ const fields = fromApiFields(state.immFields, state.mutFields, fieldsSig, parentContract.structs)
2050
+ return fields['value'] as R
2051
+ } catch (error) {
2052
+ if (error instanceof Error && error.message.includes('KeyNotFound')) {
2053
+ // the map item contract does not exist
2054
+ return undefined
2055
+ }
2056
+ throw error
2057
+ }
2058
+ }
2059
+
2010
2060
  interface MapInfo {
2011
2061
  name: string
2012
2062
  value: Map<Val, Val>