@alephium/web3 0.39.2 → 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.
- package/dist/alephium-web3.min.js +1 -1
- package/dist/alephium-web3.min.js.map +1 -1
- package/dist/src/api/api-alephium.d.ts +1 -1
- package/dist/src/api/api-alephium.js +1 -1
- package/dist/src/codec/instr-codec.d.ts +3 -0
- package/dist/src/codec/instr-codec.js +19 -3
- package/dist/src/contract/contract.d.ts +9 -0
- package/dist/src/contract/contract.js +39 -1
- package/dist/src/utils/utils.d.ts +2 -0
- package/dist/src/utils/utils.js +25 -1
- package/package.json +3 -3
- package/src/api/api-alephium.ts +1 -1
- package/src/codec/instr-codec.ts +14 -1
- package/src/contract/contract.ts +50 -0
- package/src/utils/utils.ts +25 -0
|
@@ -1007,7 +1007,7 @@ export declare class HttpClient<SecurityDataType = unknown> {
|
|
|
1007
1007
|
}
|
|
1008
1008
|
/**
|
|
1009
1009
|
* @title Alephium API
|
|
1010
|
-
* @version 2.
|
|
1010
|
+
* @version 2.14.0
|
|
1011
1011
|
* @baseUrl ../
|
|
1012
1012
|
*/
|
|
1013
1013
|
export declare class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDataType> {
|
|
@@ -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.
|
|
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)
|
|
@@ -21,6 +21,8 @@ export declare function stringToHex(str: string): string;
|
|
|
21
21
|
export declare function hexToString(str: string): string;
|
|
22
22
|
export declare function sleep(ms: number): Promise<void>;
|
|
23
23
|
export declare function isDevnet(networkId?: number): boolean;
|
|
24
|
+
export declare function targetToDifficulty(compactedTarget: HexString): bigint;
|
|
25
|
+
export declare function difficultyToTarget(diff: bigint): HexString;
|
|
24
26
|
type _Eq<X, Y> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : false;
|
|
25
27
|
export type Eq<X, Y> = _Eq<{
|
|
26
28
|
[P in keyof X]: X[P];
|
package/dist/src/utils/utils.js
CHANGED
|
@@ -20,7 +20,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
20
20
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
21
21
|
};
|
|
22
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
-
exports.assertType = exports.isDevnet = exports.sleep = exports.hexToString = exports.stringToHex = exports.blockChainIndex = exports.binToHex = exports.hexToBinUnsafe = exports.toNonNegativeBigInt = exports.isHexString = exports.signatureDecode = exports.encodeHexSignature = exports.encodeSignature = exports.networkIds = void 0;
|
|
23
|
+
exports.assertType = exports.difficultyToTarget = exports.targetToDifficulty = exports.isDevnet = exports.sleep = exports.hexToString = exports.stringToHex = exports.blockChainIndex = exports.binToHex = exports.hexToBinUnsafe = exports.toNonNegativeBigInt = exports.isHexString = exports.signatureDecode = exports.encodeHexSignature = exports.encodeSignature = exports.networkIds = void 0;
|
|
24
24
|
const elliptic_1 = require("elliptic");
|
|
25
25
|
const bn_js_1 = __importDefault(require("bn.js"));
|
|
26
26
|
const buffer_1 = require("buffer/");
|
|
@@ -110,6 +110,30 @@ function isDevnet(networkId) {
|
|
|
110
110
|
return networkId !== 0 && networkId !== 1;
|
|
111
111
|
}
|
|
112
112
|
exports.isDevnet = isDevnet;
|
|
113
|
+
function targetToDifficulty(compactedTarget) {
|
|
114
|
+
if (!isHexString(compactedTarget) || compactedTarget.length !== 8) {
|
|
115
|
+
throw Error(`Invalid target ${compactedTarget}, expected a hex string of length 8`);
|
|
116
|
+
}
|
|
117
|
+
const size = hexToBinUnsafe(compactedTarget.slice(0, 2))[0];
|
|
118
|
+
const mantissa = BigInt('0x' + compactedTarget.slice(2));
|
|
119
|
+
const maxBigInt = 1n << 256n;
|
|
120
|
+
const target = size <= 3 ? mantissa >> BigInt(8 * (3 - size)) : mantissa << BigInt(8 * (size - 3));
|
|
121
|
+
return maxBigInt / target;
|
|
122
|
+
}
|
|
123
|
+
exports.targetToDifficulty = targetToDifficulty;
|
|
124
|
+
function difficultyToTarget(diff) {
|
|
125
|
+
const maxBigInt = 1n << 256n;
|
|
126
|
+
const target = diff === 1n ? maxBigInt - 1n : maxBigInt / diff;
|
|
127
|
+
const size = Math.floor((target.toString(2).length + 7) / 8);
|
|
128
|
+
const mantissa = size <= 3
|
|
129
|
+
? BigInt.asIntN(32, target) << BigInt(8 * (3 - size))
|
|
130
|
+
: BigInt.asIntN(32, target >> BigInt(8 * (size - 3)));
|
|
131
|
+
const mantissaBytes = buffer_1.Buffer.alloc(4);
|
|
132
|
+
mantissaBytes.writeInt32BE(Number(mantissa), 0);
|
|
133
|
+
const bytes = new Uint8Array([size, ...mantissaBytes.slice(1)]);
|
|
134
|
+
return binToHex(bytes);
|
|
135
|
+
}
|
|
136
|
+
exports.difficultyToTarget = difficultyToTarget;
|
|
113
137
|
// eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars
|
|
114
138
|
function assertType() { }
|
|
115
139
|
exports.assertType = assertType;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alephium/web3",
|
|
3
|
-
"version": "0.
|
|
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.
|
|
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/
|
|
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
|
}
|
package/src/api/api-alephium.ts
CHANGED
|
@@ -1306,7 +1306,7 @@ export class HttpClient<SecurityDataType = unknown> {
|
|
|
1306
1306
|
|
|
1307
1307
|
/**
|
|
1308
1308
|
* @title Alephium API
|
|
1309
|
-
* @version 2.
|
|
1309
|
+
* @version 2.14.0
|
|
1310
1310
|
* @baseUrl ../
|
|
1311
1311
|
*/
|
|
1312
1312
|
export class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDataType> {
|
package/src/codec/instr-codec.ts
CHANGED
|
@@ -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)
|
package/src/contract/contract.ts
CHANGED
|
@@ -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>
|
package/src/utils/utils.ts
CHANGED
|
@@ -112,6 +112,31 @@ export function isDevnet(networkId?: number): boolean {
|
|
|
112
112
|
return networkId !== 0 && networkId !== 1
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
+
export function targetToDifficulty(compactedTarget: HexString): bigint {
|
|
116
|
+
if (!isHexString(compactedTarget) || compactedTarget.length !== 8) {
|
|
117
|
+
throw Error(`Invalid target ${compactedTarget}, expected a hex string of length 8`)
|
|
118
|
+
}
|
|
119
|
+
const size = hexToBinUnsafe(compactedTarget.slice(0, 2))[0]
|
|
120
|
+
const mantissa = BigInt('0x' + compactedTarget.slice(2))
|
|
121
|
+
const maxBigInt = 1n << 256n
|
|
122
|
+
const target = size <= 3 ? mantissa >> BigInt(8 * (3 - size)) : mantissa << BigInt(8 * (size - 3))
|
|
123
|
+
return maxBigInt / target
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export function difficultyToTarget(diff: bigint): HexString {
|
|
127
|
+
const maxBigInt = 1n << 256n
|
|
128
|
+
const target = diff === 1n ? maxBigInt - 1n : maxBigInt / diff
|
|
129
|
+
const size = Math.floor((target.toString(2).length + 7) / 8)
|
|
130
|
+
const mantissa =
|
|
131
|
+
size <= 3
|
|
132
|
+
? BigInt.asIntN(32, target) << BigInt(8 * (3 - size))
|
|
133
|
+
: BigInt.asIntN(32, target >> BigInt(8 * (size - 3)))
|
|
134
|
+
const mantissaBytes = Buffer.alloc(4)
|
|
135
|
+
mantissaBytes.writeInt32BE(Number(mantissa), 0)
|
|
136
|
+
const bytes = new Uint8Array([size, ...mantissaBytes.slice(1)])
|
|
137
|
+
return binToHex(bytes)
|
|
138
|
+
}
|
|
139
|
+
|
|
115
140
|
type _Eq<X, Y> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : false
|
|
116
141
|
export type Eq<X, Y> = _Eq<{ [P in keyof X]: X[P] }, { [P in keyof Y]: Y[P] }>
|
|
117
142
|
// eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars
|