@alephium/web3 1.3.0 → 1.5.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/address/address.js +11 -5
- package/dist/src/api/api-alephium.d.ts +2 -4
- package/dist/src/api/api-alephium.js +1 -1
- package/dist/src/codec/array-codec.d.ts +4 -12
- package/dist/src/codec/array-codec.js +15 -28
- package/dist/src/codec/asset-output-codec.d.ts +6 -11
- package/dist/src/codec/asset-output-codec.js +32 -71
- package/dist/src/codec/bigint-codec.d.ts +2 -1
- package/dist/src/codec/bigint-codec.js +14 -2
- package/dist/src/codec/bytestring-codec.d.ts +6 -11
- package/dist/src/codec/bytestring-codec.js +9 -23
- package/dist/src/codec/codec.d.ts +54 -5
- package/dist/src/codec/codec.js +112 -14
- package/dist/src/codec/compact-int-codec.d.ts +65 -44
- package/dist/src/codec/compact-int-codec.js +222 -204
- package/dist/src/codec/contract-codec.d.ts +5 -8
- package/dist/src/codec/contract-codec.js +15 -29
- package/dist/src/codec/contract-output-codec.d.ts +4 -10
- package/dist/src/codec/contract-output-codec.js +20 -40
- package/dist/src/codec/contract-output-ref-codec.d.ts +2 -8
- package/dist/src/codec/contract-output-ref-codec.js +7 -17
- package/dist/src/codec/either-codec.d.ts +8 -15
- package/dist/src/codec/either-codec.js +5 -46
- package/dist/src/codec/index.d.ts +4 -3
- package/dist/src/codec/index.js +7 -4
- package/dist/src/codec/input-codec.d.ts +4 -10
- package/dist/src/codec/input-codec.js +11 -46
- package/dist/src/codec/instr-codec.d.ts +633 -40
- package/dist/src/codec/instr-codec.js +1040 -434
- package/dist/src/codec/int-as-4bytes-codec.d.ts +7 -0
- package/dist/src/codec/{signed-int-codec.js → int-as-4bytes-codec.js} +6 -12
- package/dist/src/codec/lockup-script-codec.d.ts +23 -26
- package/dist/src/codec/lockup-script-codec.js +12 -58
- package/dist/src/codec/method-codec.d.ts +6 -18
- package/dist/src/codec/method-codec.js +20 -48
- package/dist/src/codec/option-codec.d.ts +8 -13
- package/dist/src/codec/option-codec.js +14 -32
- package/dist/src/codec/output-codec.d.ts +2 -2
- package/dist/src/codec/output-codec.js +1 -1
- package/dist/src/codec/reader.d.ts +8 -0
- package/dist/src/codec/reader.js +48 -0
- package/dist/src/codec/script-codec.d.ts +6 -14
- package/dist/src/codec/script-codec.js +6 -22
- package/dist/src/codec/signature-codec.d.ts +4 -12
- package/dist/src/codec/signature-codec.js +3 -15
- package/dist/src/codec/timestamp-codec.d.ts +8 -0
- package/dist/src/codec/timestamp-codec.js +39 -0
- package/dist/src/codec/token-codec.d.ts +3 -10
- package/dist/src/codec/token-codec.js +6 -24
- package/dist/src/codec/transaction-codec.d.ts +6 -11
- package/dist/src/codec/transaction-codec.js +24 -49
- package/dist/src/codec/unlock-script-codec.d.ts +25 -36
- package/dist/src/codec/unlock-script-codec.js +26 -147
- package/dist/src/codec/unsigned-tx-codec.d.ts +8 -14
- package/dist/src/codec/unsigned-tx-codec.js +24 -66
- package/dist/src/codec/val.d.ts +27 -0
- package/dist/src/codec/val.js +33 -0
- package/dist/src/contract/contract.d.ts +1 -0
- package/dist/src/contract/contract.js +20 -13
- package/dist/src/contract/index.d.ts +1 -0
- package/dist/src/contract/index.js +1 -0
- package/dist/src/contract/ralph.d.ts +0 -4
- package/dist/src/contract/ralph.js +50 -179
- package/dist/src/contract/script-simulator.d.ts +27 -0
- package/dist/src/contract/script-simulator.js +757 -0
- package/dist/src/exchange/exchange.js +1 -1
- package/package.json +3 -4
- package/src/address/address.ts +15 -9
- package/src/api/api-alephium.ts +2 -4
- package/src/codec/array-codec.ts +16 -34
- package/src/codec/asset-output-codec.ts +38 -83
- package/src/codec/bigint-codec.ts +16 -2
- package/src/codec/bytestring-codec.ts +10 -28
- package/src/codec/codec.ts +121 -15
- package/src/codec/compact-int-codec.ts +230 -207
- package/src/codec/contract-codec.ts +20 -33
- package/src/codec/contract-output-codec.ts +22 -48
- package/src/codec/contract-output-ref-codec.ts +6 -17
- package/src/codec/either-codec.ts +4 -53
- package/src/codec/index.ts +4 -3
- package/src/codec/input-codec.ts +14 -36
- package/src/codec/instr-codec.ts +1229 -455
- package/src/codec/{signed-int-codec.ts → int-as-4bytes-codec.ts} +6 -10
- package/src/codec/lockup-script-codec.ts +28 -76
- package/src/codec/method-codec.ts +23 -61
- package/src/codec/option-codec.ts +13 -36
- package/src/codec/output-codec.ts +2 -2
- package/src/codec/reader.ts +56 -0
- package/src/codec/script-codec.ts +9 -31
- package/src/codec/signature-codec.ts +3 -18
- package/src/codec/timestamp-codec.ts +42 -0
- package/src/codec/token-codec.ts +7 -26
- package/src/codec/transaction-codec.ts +29 -58
- package/src/codec/unlock-script-codec.ts +44 -171
- package/src/codec/unsigned-tx-codec.ts +34 -63
- package/src/codec/val.ts +40 -0
- package/src/contract/contract.ts +24 -20
- package/src/contract/index.ts +1 -0
- package/src/contract/ralph.ts +76 -172
- package/src/contract/script-simulator.ts +838 -0
- package/src/exchange/exchange.ts +1 -1
- package/dist/src/codec/long-codec.d.ts +0 -8
- package/dist/src/codec/long-codec.js +0 -55
- package/dist/src/codec/signed-int-codec.d.ts +0 -8
- package/src/codec/long-codec.ts +0 -58
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright 2018 - 2022 The Alephium Authors
|
|
4
|
+
This file is part of the alephium project.
|
|
5
|
+
|
|
6
|
+
The library is free software: you can redistribute it and/or modify
|
|
7
|
+
it under the terms of the GNU Lesser General Public License as published by
|
|
8
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
9
|
+
(at your option) any later version.
|
|
10
|
+
|
|
11
|
+
The library is distributed in the hope that it will be useful,
|
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
GNU Lesser General Public License for more details.
|
|
15
|
+
|
|
16
|
+
You should have received a copy of the GNU Lesser General Public License
|
|
17
|
+
along with the library. If not, see <http://www.gnu.org/licenses/>.
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.valsCodec = exports.valCodec = void 0;
|
|
21
|
+
const compact_int_codec_1 = require("./compact-int-codec");
|
|
22
|
+
const bytestring_codec_1 = require("./bytestring-codec");
|
|
23
|
+
const codec_1 = require("./codec");
|
|
24
|
+
const lockup_script_codec_1 = require("./lockup-script-codec");
|
|
25
|
+
const array_codec_1 = require("./array-codec");
|
|
26
|
+
exports.valCodec = new codec_1.EnumCodec('val', {
|
|
27
|
+
Bool: codec_1.boolCodec,
|
|
28
|
+
I256: compact_int_codec_1.i256Codec,
|
|
29
|
+
U256: compact_int_codec_1.u256Codec,
|
|
30
|
+
ByteVec: bytestring_codec_1.byteStringCodec,
|
|
31
|
+
Address: lockup_script_codec_1.lockupScriptCodec
|
|
32
|
+
});
|
|
33
|
+
exports.valsCodec = new array_codec_1.ArrayCodec(exports.valCodec);
|
|
@@ -182,6 +182,7 @@ export declare abstract class ContractFactory<I extends ContractInstance, F exte
|
|
|
182
182
|
constructor(contract: Contract);
|
|
183
183
|
abstract at(address: string): I;
|
|
184
184
|
deploy(signer: SignerProvider, deployParams: DeployContractParams<F>): Promise<DeployContractResult<I>>;
|
|
185
|
+
deployTemplate(signer: SignerProvider): Promise<DeployContractResult<I>>;
|
|
185
186
|
stateForTest(initFields: F, asset?: Asset, address?: string): ContractState<F>;
|
|
186
187
|
}
|
|
187
188
|
export declare class ExecutableScript<P extends Fields = Fields, R extends Val | null = null> {
|
|
@@ -60,7 +60,8 @@ exports.DEFAULT_NODE_COMPILER_OPTIONS = {
|
|
|
60
60
|
ignoreUnusedFieldsWarnings: false,
|
|
61
61
|
ignoreUnusedPrivateFunctionsWarnings: false,
|
|
62
62
|
ignoreUpdateFieldsCheckWarnings: false,
|
|
63
|
-
ignoreCheckExternalCallerWarnings: false
|
|
63
|
+
ignoreCheckExternalCallerWarnings: false,
|
|
64
|
+
ignoreUnusedFunctionReturnWarnings: false
|
|
64
65
|
};
|
|
65
66
|
exports.DEFAULT_COMPILER_OPTIONS = { errorOnWarnings: true, ...exports.DEFAULT_NODE_COMPILER_OPTIONS };
|
|
66
67
|
class Struct {
|
|
@@ -627,6 +628,11 @@ class ContractFactory {
|
|
|
627
628
|
contractInstance: this.at(result.contractAddress)
|
|
628
629
|
};
|
|
629
630
|
}
|
|
631
|
+
async deployTemplate(signer) {
|
|
632
|
+
return this.deploy(signer, {
|
|
633
|
+
initialFields: this.contract.getInitialFieldsWithDefaultValues()
|
|
634
|
+
});
|
|
635
|
+
}
|
|
630
636
|
// This is used for testing contract functions
|
|
631
637
|
stateForTest(initFields, asset, address) {
|
|
632
638
|
const newAsset = {
|
|
@@ -1068,8 +1074,8 @@ exports.callMethod = callMethod;
|
|
|
1068
1074
|
async function signExecuteMethod(contract, instance, methodName, params) {
|
|
1069
1075
|
const methodIndex = contract.contract.getMethodIndex(methodName);
|
|
1070
1076
|
const functionSig = contract.contract.functions[methodIndex];
|
|
1071
|
-
const
|
|
1072
|
-
const bytecodeTemplate = getBytecodeTemplate(methodIndex,
|
|
1077
|
+
const methodUsePreapprovedAssets = contract.contract.decodedMethods[methodIndex].usePreapprovedAssets;
|
|
1078
|
+
const bytecodeTemplate = getBytecodeTemplate(methodIndex, methodUsePreapprovedAssets, functionSig, contract.contract.structs, params.attoAlphAmount, params.tokens);
|
|
1073
1079
|
const fieldsSig = toFieldsSig(contract.contract.name, functionSig);
|
|
1074
1080
|
const bytecode = ralph.buildScriptByteCode(bytecodeTemplate, { __contract__: instance.contractId, ...params.args }, fieldsSig, contract.contract.structs);
|
|
1075
1081
|
const signer = params.signer;
|
|
@@ -1086,16 +1092,20 @@ async function signExecuteMethod(contract, instance, methodName, params) {
|
|
|
1086
1092
|
return await signer.signAndSubmitExecuteScriptTx(signerParams);
|
|
1087
1093
|
}
|
|
1088
1094
|
exports.signExecuteMethod = signExecuteMethod;
|
|
1089
|
-
function getBytecodeTemplate(methodIndex,
|
|
1095
|
+
function getBytecodeTemplate(methodIndex, methodUsePreapprovedAssets, functionSig, structs, attoAlphAmount, tokens) {
|
|
1090
1096
|
// For the default TxScript main function
|
|
1091
1097
|
const numberOfMethods = '01';
|
|
1092
1098
|
const isPublic = '01';
|
|
1093
|
-
const
|
|
1099
|
+
const scriptUseApprovedAssets = attoAlphAmount !== undefined || tokens !== undefined;
|
|
1100
|
+
const modifier = scriptUseApprovedAssets ? '03' : '00';
|
|
1094
1101
|
const argsLength = '00';
|
|
1095
1102
|
const returnsLength = '00';
|
|
1103
|
+
if (methodUsePreapprovedAssets && !scriptUseApprovedAssets) {
|
|
1104
|
+
throw new Error('The contract call requires preapproved assets but none are provided');
|
|
1105
|
+
}
|
|
1096
1106
|
const [templateVarStoreLocalInstrs, templateVarsLength] = getTemplateVarStoreLocalInstrs(functionSig, structs);
|
|
1097
|
-
const approveAlphInstrs = getApproveAlphInstrs(
|
|
1098
|
-
const approveTokensInstrs = getApproveTokensInstrs(
|
|
1107
|
+
const approveAlphInstrs = getApproveAlphInstrs(methodUsePreapprovedAssets ? attoAlphAmount : undefined);
|
|
1108
|
+
const approveTokensInstrs = getApproveTokensInstrs(methodUsePreapprovedAssets ? tokens : undefined);
|
|
1099
1109
|
const callerInstrs = getCallAddressInstrs(approveAlphInstrs.length / 2 + approveTokensInstrs.length / 3);
|
|
1100
1110
|
// First template var is the contract
|
|
1101
1111
|
const functionArgsNum = encodeU256Const(BigInt(templateVarsLength - 1));
|
|
@@ -1146,10 +1156,7 @@ function getApproveTokensInstrs(tokens) {
|
|
|
1146
1156
|
if (tokens) {
|
|
1147
1157
|
tokens.forEach((token) => {
|
|
1148
1158
|
const tokenIdBin = (0, utils_1.hexToBinUnsafe)(token.id);
|
|
1149
|
-
approveTokensInstrs.push(encodeInstr((0, codec_1.
|
|
1150
|
-
length: codec_1.compactSignedIntCodec.fromI32(tokenIdBin.length),
|
|
1151
|
-
value: tokenIdBin
|
|
1152
|
-
})));
|
|
1159
|
+
approveTokensInstrs.push(encodeInstr((0, codec_1.BytesConst)(tokenIdBin)));
|
|
1153
1160
|
approveTokensInstrs.push(encodeU256Const(BigInt(token.amount)));
|
|
1154
1161
|
approveTokensInstrs.push(encodeInstr(codec_1.ApproveToken));
|
|
1155
1162
|
});
|
|
@@ -1218,7 +1225,7 @@ function encodeLoadLocalInstr(index) {
|
|
|
1218
1225
|
return encodeInstr((0, codec_1.LoadLocal)(index));
|
|
1219
1226
|
}
|
|
1220
1227
|
function encodeI32(value) {
|
|
1221
|
-
return (0, utils_1.binToHex)(codec_1.
|
|
1228
|
+
return (0, utils_1.binToHex)(codec_1.i32Codec.encode(value));
|
|
1222
1229
|
}
|
|
1223
1230
|
function encodeU256Const(value) {
|
|
1224
1231
|
if (value < 0) {
|
|
@@ -1228,7 +1235,7 @@ function encodeU256Const(value) {
|
|
|
1228
1235
|
return (BigInt(0x0c) + value).toString(16).padStart(2, '0');
|
|
1229
1236
|
}
|
|
1230
1237
|
else {
|
|
1231
|
-
return encodeInstr((0, codec_1.U256Const)(
|
|
1238
|
+
return encodeInstr((0, codec_1.U256Const)(value));
|
|
1232
1239
|
}
|
|
1233
1240
|
}
|
|
1234
1241
|
function encodeInstr(instr) {
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { Val } from '../api';
|
|
2
2
|
import { HexString } from '../utils';
|
|
3
3
|
import { Fields, FieldsSig, Struct } from './contract';
|
|
4
|
-
export declare function encodeBool(bool: boolean): Uint8Array;
|
|
5
|
-
export declare function decodeBool(bytes: Uint8Array): boolean;
|
|
6
|
-
export declare function encodeI256(i256: bigint): Uint8Array;
|
|
7
|
-
export declare function encodeU256(u256: bigint): Uint8Array;
|
|
8
4
|
export declare function encodeByteVec(hex: string): Uint8Array;
|
|
9
5
|
export declare function encodeAddress(address: string): Uint8Array;
|
|
10
6
|
export declare enum VmValType {
|
|
@@ -16,155 +16,18 @@ GNU Lesser General Public License for more details.
|
|
|
16
16
|
You should have received a copy of the GNU Lesser General Public License
|
|
17
17
|
along with the library. If not, see <http://www.gnu.org/licenses/>.
|
|
18
18
|
*/
|
|
19
|
-
var _a;
|
|
20
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
-
exports.buildDebugBytecode = exports.encodeContractField = exports.buildContractByteCode = exports.encodeContractFields = exports.buildScriptByteCode = exports.flattenFields = exports.typeLength = exports.encodeMapKey = exports.decodePrimitive = exports.tryDecodeMapDebugLog = exports.calcFieldSize = exports.encodeMapPrefix = exports.parseMapType = exports.splitFields = exports.encodeScriptField = exports.encodeScriptFieldAsString = exports.encodePrimitiveValues = exports.addressVal = exports.byteVecVal = exports.u256Val = exports.i256Val = exports.boolVal = exports.encodeVmAddress = exports.encodeVmByteVec = exports.encodeVmU256 = exports.encodeVmI256 = exports.encodeVmBool = exports.VmValType = exports.encodeAddress = exports.encodeByteVec =
|
|
20
|
+
exports.buildDebugBytecode = exports.encodeContractField = exports.buildContractByteCode = exports.encodeContractFields = exports.buildScriptByteCode = exports.flattenFields = exports.typeLength = exports.encodeMapKey = exports.decodePrimitive = exports.tryDecodeMapDebugLog = exports.calcFieldSize = exports.encodeMapPrefix = exports.parseMapType = exports.splitFields = exports.encodeScriptField = exports.encodeScriptFieldAsString = exports.encodePrimitiveValues = exports.addressVal = exports.byteVecVal = exports.u256Val = exports.i256Val = exports.boolVal = exports.encodeVmAddress = exports.encodeVmByteVec = exports.encodeVmU256 = exports.encodeVmI256 = exports.encodeVmBool = exports.VmValType = exports.encodeAddress = exports.encodeByteVec = void 0;
|
|
22
21
|
const api_1 = require("../api");
|
|
23
22
|
const utils_1 = require("../utils");
|
|
24
23
|
const codec_1 = require("../codec");
|
|
25
|
-
const
|
|
26
|
-
class UnSigned {
|
|
27
|
-
}
|
|
28
|
-
UnSigned.oneByteBound = BigInt(0x40);
|
|
29
|
-
UnSigned.twoByteBound = UnSigned.oneByteBound << BigInt(8);
|
|
30
|
-
UnSigned.fourByteBound = UnSigned.oneByteBound << BigInt(8 * 3);
|
|
31
|
-
UnSigned.u256UpperBound = BigInt(1) << BigInt(256);
|
|
32
|
-
class Signed {
|
|
33
|
-
}
|
|
34
|
-
_a = Signed;
|
|
35
|
-
Signed.oneByteBound = BigInt(0x20);
|
|
36
|
-
Signed.twoByteBound = Signed.oneByteBound << BigInt(8);
|
|
37
|
-
Signed.fourByteBound = Signed.oneByteBound << BigInt(8 * 3);
|
|
38
|
-
Signed.i256UpperBound = BigInt(1) << BigInt(255);
|
|
39
|
-
Signed.i256LowerBound = -_a.i256UpperBound;
|
|
40
|
-
class CompactInt {
|
|
41
|
-
}
|
|
42
|
-
CompactInt.oneBytePrefix = 0x00;
|
|
43
|
-
CompactInt.oneByteNegPrefix = 0xc0;
|
|
44
|
-
CompactInt.twoBytePrefix = 0x40;
|
|
45
|
-
CompactInt.twoByteNegPrefix = 0x80;
|
|
46
|
-
CompactInt.fourBytePrefix = 0x80;
|
|
47
|
-
CompactInt.fourByteNegPrefix = 0x40;
|
|
48
|
-
CompactInt.multiBytePrefix = 0xc0;
|
|
49
|
-
function encodeBool(bool) {
|
|
50
|
-
return bool ? Uint8Array.from([1]) : Uint8Array.from([0]);
|
|
51
|
-
}
|
|
52
|
-
exports.encodeBool = encodeBool;
|
|
53
|
-
function decodeBool(bytes) {
|
|
54
|
-
if (bytes.length !== 1) {
|
|
55
|
-
throw new Error(`Expected one byte for encoded bool, got ${bytes.length}`);
|
|
56
|
-
}
|
|
57
|
-
return bytes[0] === 1 ? true : false;
|
|
58
|
-
}
|
|
59
|
-
exports.decodeBool = decodeBool;
|
|
60
|
-
function encodeI256(i256) {
|
|
61
|
-
if (i256 >= bigIntZero) {
|
|
62
|
-
return encodeI256Positive(i256);
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
return encodeI256Negative(i256);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
exports.encodeI256 = encodeI256;
|
|
69
|
-
// n should be positive
|
|
70
|
-
function toByteArray(n, signed, notBit) {
|
|
71
|
-
let hex = n.toString(16);
|
|
72
|
-
if (hex.length % 2 === 1) {
|
|
73
|
-
hex = '0' + hex;
|
|
74
|
-
}
|
|
75
|
-
else if (signed && hex[0] >= '8') {
|
|
76
|
-
hex = '00' + hex; // add the byte for sign
|
|
77
|
-
}
|
|
78
|
-
const byteLength = hex.length / 2;
|
|
79
|
-
const bytes = new Uint8Array(byteLength + 1);
|
|
80
|
-
for (let index = 0; index < byteLength; index++) {
|
|
81
|
-
const offset = index * 2;
|
|
82
|
-
const byte = parseInt(hex.slice(offset, offset + 2), 16);
|
|
83
|
-
bytes[`${index + 1}`] = notBit ? ~byte : byte;
|
|
84
|
-
}
|
|
85
|
-
const header = byteLength - 4 + CompactInt.multiBytePrefix;
|
|
86
|
-
bytes[0] = header;
|
|
87
|
-
return bytes;
|
|
88
|
-
}
|
|
89
|
-
function encodeI256Positive(i256) {
|
|
90
|
-
if (i256 < Signed.oneByteBound) {
|
|
91
|
-
return new Uint8Array([Number(i256) + CompactInt.oneBytePrefix]);
|
|
92
|
-
}
|
|
93
|
-
else if (i256 < Signed.twoByteBound) {
|
|
94
|
-
const num = Number(i256);
|
|
95
|
-
return new Uint8Array([(num >> 8) + CompactInt.twoBytePrefix, num & 0xff]);
|
|
96
|
-
}
|
|
97
|
-
else if (i256 < Signed.fourByteBound) {
|
|
98
|
-
const num = Number(i256);
|
|
99
|
-
return new Uint8Array([(num >> 24) + CompactInt.fourBytePrefix, (num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff]);
|
|
100
|
-
}
|
|
101
|
-
else if (i256 < Signed.i256UpperBound) {
|
|
102
|
-
return toByteArray(i256, true, false);
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
throw Error(`Too large number for i256: ${i256}`);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
function encodeI256Negative(i256) {
|
|
109
|
-
if (i256 >= -Signed.oneByteBound) {
|
|
110
|
-
const num = Number(i256);
|
|
111
|
-
return new Uint8Array([(num ^ CompactInt.oneByteNegPrefix) & 0xff]);
|
|
112
|
-
}
|
|
113
|
-
else if (i256 >= -Signed.twoByteBound) {
|
|
114
|
-
const num = Number(i256);
|
|
115
|
-
return new Uint8Array([((num >> 8) ^ CompactInt.twoByteNegPrefix) & 0xff, num & 0xff]);
|
|
116
|
-
}
|
|
117
|
-
else if (i256 >= -Signed.fourByteBound) {
|
|
118
|
-
const num = Number(i256);
|
|
119
|
-
return new Uint8Array([
|
|
120
|
-
((num >> 24) ^ CompactInt.fourByteNegPrefix) & 0xff,
|
|
121
|
-
(num >> 16) & 0xff,
|
|
122
|
-
(num >> 8) & 0xff,
|
|
123
|
-
num & 0xff
|
|
124
|
-
]);
|
|
125
|
-
}
|
|
126
|
-
else if (i256 >= Signed.i256LowerBound) {
|
|
127
|
-
return toByteArray(~i256, true, true);
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
throw Error(`Too small number for i256: ${i256}`);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
function encodeU256(u256) {
|
|
134
|
-
if (u256 < bigIntZero) {
|
|
135
|
-
throw Error(`Negative number for U256: ${u256}`);
|
|
136
|
-
}
|
|
137
|
-
else if (u256 < UnSigned.oneByteBound) {
|
|
138
|
-
return new Uint8Array([Number(u256) + CompactInt.oneBytePrefix]);
|
|
139
|
-
}
|
|
140
|
-
else if (u256 < UnSigned.twoByteBound) {
|
|
141
|
-
const num = Number(u256);
|
|
142
|
-
return new Uint8Array([((num >> 8) & 0xff) + CompactInt.twoBytePrefix, num & 0xff]);
|
|
143
|
-
}
|
|
144
|
-
else if (u256 < UnSigned.fourByteBound) {
|
|
145
|
-
const num = Number(u256);
|
|
146
|
-
return new Uint8Array([
|
|
147
|
-
((num >> 24) & 0xff) + CompactInt.fourBytePrefix,
|
|
148
|
-
(num >> 16) & 0xff,
|
|
149
|
-
(num >> 8) & 0xff,
|
|
150
|
-
num & 0xff
|
|
151
|
-
]);
|
|
152
|
-
}
|
|
153
|
-
else if (u256 < UnSigned.u256UpperBound) {
|
|
154
|
-
return toByteArray(u256, false, false);
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
throw Error(`Too large number for U256: ${u256}`);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
exports.encodeU256 = encodeU256;
|
|
24
|
+
const codec_2 = require("../codec/codec");
|
|
161
25
|
function encodeByteVec(hex) {
|
|
162
26
|
if (!(0, utils_1.isHexString)(hex)) {
|
|
163
27
|
throw Error(`Given value ${hex} is not a valid hex string`);
|
|
164
28
|
}
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
return (0, utils_1.concatBytes)([bytes1, bytes0]);
|
|
29
|
+
const bytes = (0, utils_1.hexToBinUnsafe)(hex);
|
|
30
|
+
return codec_1.byteStringCodec.encode(bytes);
|
|
168
31
|
}
|
|
169
32
|
exports.encodeByteVec = encodeByteVec;
|
|
170
33
|
function encodeAddress(address) {
|
|
@@ -180,15 +43,15 @@ var VmValType;
|
|
|
180
43
|
VmValType[VmValType["Address"] = 4] = "Address";
|
|
181
44
|
})(VmValType = exports.VmValType || (exports.VmValType = {}));
|
|
182
45
|
function encodeVmBool(bool) {
|
|
183
|
-
return new Uint8Array([VmValType.Bool, ...
|
|
46
|
+
return new Uint8Array([VmValType.Bool, ...codec_2.boolCodec.encode(bool)]);
|
|
184
47
|
}
|
|
185
48
|
exports.encodeVmBool = encodeVmBool;
|
|
186
49
|
function encodeVmI256(i256) {
|
|
187
|
-
return new Uint8Array([VmValType.I256, ...
|
|
50
|
+
return new Uint8Array([VmValType.I256, ...codec_1.i256Codec.encode(i256)]);
|
|
188
51
|
}
|
|
189
52
|
exports.encodeVmI256 = encodeVmI256;
|
|
190
53
|
function encodeVmU256(u256) {
|
|
191
|
-
return new Uint8Array([VmValType.U256, ...
|
|
54
|
+
return new Uint8Array([VmValType.U256, ...codec_1.u256Codec.encode(u256)]);
|
|
192
55
|
}
|
|
193
56
|
exports.encodeVmU256 = encodeVmU256;
|
|
194
57
|
function encodeVmByteVec(bytes) {
|
|
@@ -226,35 +89,43 @@ exports.encodePrimitiveValues = encodePrimitiveValues;
|
|
|
226
89
|
function invalidScriptField(tpe, value) {
|
|
227
90
|
return Error(`Invalid script field ${value} for type ${tpe}`);
|
|
228
91
|
}
|
|
229
|
-
var Instruction;
|
|
230
|
-
(function (Instruction) {
|
|
231
|
-
Instruction[Instruction["trueConst"] = 3] = "trueConst";
|
|
232
|
-
Instruction[Instruction["falseConst"] = 4] = "falseConst";
|
|
233
|
-
Instruction[Instruction["i256Const0"] = 5] = "i256Const0";
|
|
234
|
-
Instruction[Instruction["i256Const1"] = 6] = "i256Const1";
|
|
235
|
-
Instruction[Instruction["i256Const2"] = 7] = "i256Const2";
|
|
236
|
-
Instruction[Instruction["i256Const3"] = 8] = "i256Const3";
|
|
237
|
-
Instruction[Instruction["i256Const4"] = 9] = "i256Const4";
|
|
238
|
-
Instruction[Instruction["i256Const5"] = 10] = "i256Const5";
|
|
239
|
-
Instruction[Instruction["i256ConstN1"] = 11] = "i256ConstN1";
|
|
240
|
-
Instruction[Instruction["u256Const0"] = 12] = "u256Const0";
|
|
241
|
-
Instruction[Instruction["u256Const1"] = 13] = "u256Const1";
|
|
242
|
-
Instruction[Instruction["u256Const2"] = 14] = "u256Const2";
|
|
243
|
-
Instruction[Instruction["u256Const3"] = 15] = "u256Const3";
|
|
244
|
-
Instruction[Instruction["u256Const4"] = 16] = "u256Const4";
|
|
245
|
-
Instruction[Instruction["u256Const5"] = 17] = "u256Const5";
|
|
246
|
-
Instruction[Instruction["i256Const"] = 18] = "i256Const";
|
|
247
|
-
Instruction[Instruction["u256Const"] = 19] = "u256Const";
|
|
248
|
-
Instruction[Instruction["bytesConst"] = 20] = "bytesConst";
|
|
249
|
-
Instruction[Instruction["addressConst"] = 21] = "addressConst";
|
|
250
|
-
})(Instruction || (Instruction = {}));
|
|
251
|
-
// TODO: optimize
|
|
252
92
|
function encodeScriptFieldI256(value) {
|
|
253
|
-
|
|
93
|
+
switch (value) {
|
|
94
|
+
case 0n:
|
|
95
|
+
return codec_1.instrCodec.encode(codec_1.I256Const0);
|
|
96
|
+
case 1n:
|
|
97
|
+
return codec_1.instrCodec.encode(codec_1.I256Const1);
|
|
98
|
+
case 2n:
|
|
99
|
+
return codec_1.instrCodec.encode(codec_1.I256Const2);
|
|
100
|
+
case 3n:
|
|
101
|
+
return codec_1.instrCodec.encode(codec_1.I256Const3);
|
|
102
|
+
case 4n:
|
|
103
|
+
return codec_1.instrCodec.encode(codec_1.I256Const4);
|
|
104
|
+
case 5n:
|
|
105
|
+
return codec_1.instrCodec.encode(codec_1.I256Const5);
|
|
106
|
+
case -1n:
|
|
107
|
+
return codec_1.instrCodec.encode(codec_1.I256ConstN1);
|
|
108
|
+
default:
|
|
109
|
+
return codec_1.instrCodec.encode((0, codec_1.I256Const)(value));
|
|
110
|
+
}
|
|
254
111
|
}
|
|
255
|
-
// TODO: optimize
|
|
256
112
|
function encodeScriptFieldU256(value) {
|
|
257
|
-
|
|
113
|
+
switch (value) {
|
|
114
|
+
case 0n:
|
|
115
|
+
return codec_1.instrCodec.encode(codec_1.U256Const0);
|
|
116
|
+
case 1n:
|
|
117
|
+
return codec_1.instrCodec.encode(codec_1.U256Const1);
|
|
118
|
+
case 2n:
|
|
119
|
+
return codec_1.instrCodec.encode(codec_1.U256Const2);
|
|
120
|
+
case 3n:
|
|
121
|
+
return codec_1.instrCodec.encode(codec_1.U256Const3);
|
|
122
|
+
case 4n:
|
|
123
|
+
return codec_1.instrCodec.encode(codec_1.U256Const4);
|
|
124
|
+
case 5n:
|
|
125
|
+
return codec_1.instrCodec.encode(codec_1.U256Const5);
|
|
126
|
+
default:
|
|
127
|
+
return codec_1.instrCodec.encode((0, codec_1.U256Const)(value));
|
|
128
|
+
}
|
|
258
129
|
}
|
|
259
130
|
function encodeScriptFieldAsString(tpe, value) {
|
|
260
131
|
return (0, utils_1.binToHex)(encodeScriptField(tpe, value));
|
|
@@ -263,7 +134,7 @@ exports.encodeScriptFieldAsString = encodeScriptFieldAsString;
|
|
|
263
134
|
function encodeScriptField(tpe, value) {
|
|
264
135
|
switch (tpe) {
|
|
265
136
|
case 'Bool':
|
|
266
|
-
const byte = (0, api_1.toApiBoolean)(value) ?
|
|
137
|
+
const byte = (0, api_1.toApiBoolean)(value) ? codec_1.ConstTrue.code : codec_1.ConstFalse.code;
|
|
267
138
|
return new Uint8Array([byte]);
|
|
268
139
|
case 'I256':
|
|
269
140
|
const i256 = (0, api_1.toApiNumber256)(value);
|
|
@@ -273,10 +144,10 @@ function encodeScriptField(tpe, value) {
|
|
|
273
144
|
return encodeScriptFieldU256(BigInt(u256));
|
|
274
145
|
case 'Address':
|
|
275
146
|
const address = (0, api_1.toApiAddress)(value);
|
|
276
|
-
return new Uint8Array([
|
|
147
|
+
return new Uint8Array([codec_1.AddressConstCode, ...encodeAddress(address)]);
|
|
277
148
|
default: // ByteVec or Contract
|
|
278
149
|
const hexStr = (0, api_1.toApiByteVec)(value);
|
|
279
|
-
return new Uint8Array([
|
|
150
|
+
return new Uint8Array([codec_1.BytesConstCode, ...encodeByteVec(hexStr)]);
|
|
280
151
|
}
|
|
281
152
|
throw invalidScriptField(tpe, value);
|
|
282
153
|
}
|
|
@@ -366,11 +237,11 @@ exports.tryDecodeMapDebugLog = tryDecodeMapDebugLog;
|
|
|
366
237
|
function decodePrimitive(value, type) {
|
|
367
238
|
switch (type) {
|
|
368
239
|
case 'Bool':
|
|
369
|
-
return
|
|
240
|
+
return codec_2.boolCodec.decode(value);
|
|
370
241
|
case 'I256':
|
|
371
|
-
return codec_1.
|
|
242
|
+
return codec_1.i256Codec.decode(value);
|
|
372
243
|
case 'U256':
|
|
373
|
-
return codec_1.
|
|
244
|
+
return codec_1.u256Codec.decode(value);
|
|
374
245
|
case 'ByteVec':
|
|
375
246
|
return (0, utils_1.binToHex)(value);
|
|
376
247
|
case 'Address':
|
|
@@ -387,10 +258,10 @@ function encodeMapKey(value, type) {
|
|
|
387
258
|
return new Uint8Array([byte]);
|
|
388
259
|
case 'I256':
|
|
389
260
|
const i256 = (0, api_1.toApiNumber256)(value);
|
|
390
|
-
return
|
|
261
|
+
return codec_1.i256Codec.encode(BigInt(i256));
|
|
391
262
|
case 'U256':
|
|
392
263
|
const u256 = (0, api_1.toApiNumber256)(value);
|
|
393
|
-
return
|
|
264
|
+
return codec_1.u256Codec.encode(BigInt(u256));
|
|
394
265
|
case 'ByteVec':
|
|
395
266
|
const hexStr = (0, api_1.toApiByteVec)(value);
|
|
396
267
|
return (0, utils_1.hexToBinUnsafe)(hexStr);
|
|
@@ -493,7 +364,7 @@ function _encodeField(fieldName, encodeFunc) {
|
|
|
493
364
|
}
|
|
494
365
|
}
|
|
495
366
|
function encodeFields(fields) {
|
|
496
|
-
const prefix =
|
|
367
|
+
const prefix = codec_1.i32Codec.encode(fields.length);
|
|
497
368
|
return fields.reduce((acc, field) => {
|
|
498
369
|
const encoded = _encodeField(field.name, () => encodeContractField(field.type, field.value));
|
|
499
370
|
const bytes = new Uint8Array(acc.byteLength + encoded.byteLength);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Token } from '../api';
|
|
2
|
+
import { Method } from '../codec';
|
|
3
|
+
import { Script } from '../codec/script-codec';
|
|
4
|
+
import { HexString } from '../utils';
|
|
5
|
+
/**
|
|
6
|
+
* Contract call extracted from a script
|
|
7
|
+
* @param contractAddress the address of the contract
|
|
8
|
+
* @param approvedAttoAlphAmount the amount of ALPH approved to the contract
|
|
9
|
+
* - undefined if no ALPH is approved
|
|
10
|
+
* - 'unknown' if the amount cannot be determined
|
|
11
|
+
* - a number if the amount is known
|
|
12
|
+
* @param approvedTokens the tokens approved to the contract
|
|
13
|
+
* - undefined if no tokens are approved
|
|
14
|
+
* - 'unknown' if the tokens cannot be determined
|
|
15
|
+
* - an array of tokens if the tokens are known
|
|
16
|
+
*/
|
|
17
|
+
export interface ContractCall {
|
|
18
|
+
contractAddress: string;
|
|
19
|
+
approvedAttoAlphAmount?: bigint | 'unknown';
|
|
20
|
+
approvedTokens?: Token[] | 'unknown';
|
|
21
|
+
}
|
|
22
|
+
export declare class ScriptSimulator {
|
|
23
|
+
static extractContractCalls(unsignedTx: HexString): ContractCall[];
|
|
24
|
+
static extractContractCallsWithErrors(unsignedTx: HexString): ContractCall[];
|
|
25
|
+
static extractContractCallsFromScript(script: Script): ContractCall[];
|
|
26
|
+
static extractContractCallsFromMainMethod(mainMethod: Method): ContractCall[];
|
|
27
|
+
}
|