@bitgo/sdk-coin-eth 25.3.2 → 25.3.4
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/test/fixtures/eth.d.ts +39 -0
- package/dist/test/fixtures/eth.d.ts.map +1 -0
- package/dist/test/fixtures/eth.js +262 -0
- package/dist/test/resources/erc1155Abi.d.ts +40 -0
- package/dist/test/resources/erc1155Abi.d.ts.map +1 -0
- package/dist/test/resources/erc1155Abi.js +329 -0
- package/dist/test/resources/erc721Abi.d.ts +12 -0
- package/dist/test/resources/erc721Abi.d.ts.map +1 -0
- package/dist/test/resources/erc721Abi.js +34 -0
- package/dist/test/resources/eth.d.ts +51 -0
- package/dist/test/resources/eth.d.ts.map +1 -0
- package/dist/test/resources/eth.js +72 -0
- package/dist/test/resources/nftEncodings.d.ts +4 -0
- package/dist/test/resources/nftEncodings.d.ts.map +1 -0
- package/dist/test/resources/nftEncodings.js +7 -0
- package/dist/test/resources/walletSimpleAbi.d.ts +12 -0
- package/dist/test/resources/walletSimpleAbi.d.ts.map +1 -0
- package/dist/test/resources/walletSimpleAbi.js +44 -0
- package/dist/test/unit/eth.d.ts +2 -0
- package/dist/test/unit/eth.d.ts.map +1 -0
- package/dist/test/unit/eth.js +1171 -0
- package/dist/test/unit/ethWallet.d.ts +2 -0
- package/dist/test/unit/ethWallet.d.ts.map +1 -0
- package/dist/test/unit/ethWallet.js +472 -0
- package/dist/test/unit/fixtures/ethMultiSigBackupKey.d.ts +4 -0
- package/dist/test/unit/fixtures/ethMultiSigBackupKey.d.ts.map +1 -0
- package/dist/test/unit/fixtures/ethMultiSigBackupKey.js +10 -0
- package/dist/test/unit/fixtures/ethTssBackupKey.d.ts +5 -0
- package/dist/test/unit/fixtures/ethTssBackupKey.d.ts.map +1 -0
- package/dist/test/unit/fixtures/ethTssBackupKey.js +25 -0
- package/dist/test/unit/getBuilder.d.ts +3 -0
- package/dist/test/unit/getBuilder.d.ts.map +1 -0
- package/dist/test/unit/getBuilder.js +10 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +175 -0
- package/dist/test/unit/transaction.d.ts +2 -0
- package/dist/test/unit/transaction.d.ts.map +1 -0
- package/dist/test/unit/transaction.js +96 -0
- package/dist/test/unit/transactionBuilder/addressInitialization.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/addressInitialization.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/addressInitialization.js +101 -0
- package/dist/test/unit/transactionBuilder/contractCall.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/contractCall.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/contractCall.js +101 -0
- package/dist/test/unit/transactionBuilder/flushCoins.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/flushCoins.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/flushCoins.js +133 -0
- package/dist/test/unit/transactionBuilder/flushTokens.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/flushTokens.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/flushTokens.js +281 -0
- package/dist/test/unit/transactionBuilder/send.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/send.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/send.js +331 -0
- package/dist/test/unit/transactionBuilder/sendNFT.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/sendNFT.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/sendNFT.js +250 -0
- package/dist/test/unit/transactionBuilder/singleSigSend.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/singleSigSend.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/singleSigSend.js +196 -0
- package/dist/test/unit/transactionBuilder/walletInitialization.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walletInitialization.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walletInitialization.js +423 -0
- package/dist/test/unit/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transferBuilder.js +124 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +74 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +11 -8
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -1858
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const should_1 = __importDefault(require("should"));
|
|
40
|
+
const statics_1 = require("@bitgo/statics");
|
|
41
|
+
const src_1 = require("../../src");
|
|
42
|
+
const testData = __importStar(require("../resources/eth"));
|
|
43
|
+
describe('Eth send multi sig builder', function () {
|
|
44
|
+
const toAddress = '0x7325A3F7d4f9E86AE62Cf742426078C3755730d5';
|
|
45
|
+
const xprv = 'xprv9s21ZrQH143K3D8TXfvAJgHVfTEeQNW5Ys9wZtnUZkqPzFzSjbEJrWC1vZ4GnXCvR7rQL2UFX3RSuYeU9MrERm1XBvACow7c36vnz5iYyj2';
|
|
46
|
+
const key = new src_1.KeyPair({ prv: xprv }).getKeys().prv;
|
|
47
|
+
const amount = '100000000000000000'; // equivalent to 0.1 ether
|
|
48
|
+
const coin = statics_1.coins.get('hteth');
|
|
49
|
+
describe('should build', () => {
|
|
50
|
+
it('native coin transfer should succeed', async () => {
|
|
51
|
+
const builder = new src_1.TransferBuilder()
|
|
52
|
+
.expirationTime(1590078260)
|
|
53
|
+
.amount(amount)
|
|
54
|
+
.to(toAddress)
|
|
55
|
+
.contractSequenceId(2)
|
|
56
|
+
.key(key)
|
|
57
|
+
.data('0x');
|
|
58
|
+
const result = builder.signAndBuild(`${coin.chainId}`);
|
|
59
|
+
should_1.default.equal(result, testData.SEND_FUNDS_DATA);
|
|
60
|
+
});
|
|
61
|
+
it('native coin transfer with coin explicitly set should succeed', async () => {
|
|
62
|
+
const builder = new src_1.TransferBuilder()
|
|
63
|
+
.expirationTime(1590078260)
|
|
64
|
+
.coin('eth')
|
|
65
|
+
.amount(amount)
|
|
66
|
+
.to(toAddress)
|
|
67
|
+
.contractSequenceId(2)
|
|
68
|
+
.key(key)
|
|
69
|
+
.data('0x');
|
|
70
|
+
const result = builder.signAndBuild(`${coin.chainId}`);
|
|
71
|
+
should_1.default.equal(result, testData.SEND_FUNDS_DATA);
|
|
72
|
+
});
|
|
73
|
+
it('native coin transfer with sequenceId zero should succeed', async () => {
|
|
74
|
+
const builder = new src_1.TransferBuilder()
|
|
75
|
+
.expirationTime(1590078260)
|
|
76
|
+
.amount(amount)
|
|
77
|
+
.to(toAddress)
|
|
78
|
+
.contractSequenceId(0)
|
|
79
|
+
.key(key)
|
|
80
|
+
.data('0x');
|
|
81
|
+
const result = builder.signAndBuild(`${coin.chainId}`);
|
|
82
|
+
should_1.default.equal(result, testData.SEND_FUNDS_SEQUENCE_ZERO_DATA);
|
|
83
|
+
});
|
|
84
|
+
it('native coin transfer with amount 0 should succeed', async () => {
|
|
85
|
+
const builder = new src_1.TransferBuilder()
|
|
86
|
+
.expirationTime(1590078260)
|
|
87
|
+
.amount('0')
|
|
88
|
+
.to(toAddress)
|
|
89
|
+
.contractSequenceId(2)
|
|
90
|
+
.key(key)
|
|
91
|
+
.data('0x');
|
|
92
|
+
const result = builder.signAndBuild(`${coin.chainId}`);
|
|
93
|
+
should_1.default.equal(result, testData.SEND_FUNDS_AMOUNT_ZERO_DATA);
|
|
94
|
+
});
|
|
95
|
+
it('ERC20 token transfer should succeed', async () => {
|
|
96
|
+
const builder = new src_1.TransferBuilder()
|
|
97
|
+
.coin('terc')
|
|
98
|
+
.expirationTime(1590078260)
|
|
99
|
+
.amount(amount)
|
|
100
|
+
.to(toAddress)
|
|
101
|
+
.contractSequenceId(2)
|
|
102
|
+
.key(key);
|
|
103
|
+
const result = builder.signAndBuild(`${coin.chainId}`);
|
|
104
|
+
should_1.default.equal(result, testData.SEND_TERC_DATA);
|
|
105
|
+
});
|
|
106
|
+
it('should build without a signature set', () => {
|
|
107
|
+
const builder = new src_1.TransferBuilder()
|
|
108
|
+
.expirationTime(1590078260)
|
|
109
|
+
.amount(amount)
|
|
110
|
+
.to(toAddress)
|
|
111
|
+
.contractSequenceId(2)
|
|
112
|
+
.data('0x');
|
|
113
|
+
const result = builder.signAndBuild(`${coin.chainId}`);
|
|
114
|
+
should_1.default.equal(result, testData.SEND_FUNDS_NO_KEY_DATA);
|
|
115
|
+
});
|
|
116
|
+
it('should build from a non signed serialized data', () => {
|
|
117
|
+
const builder = new src_1.TransferBuilder(testData.SEND_FUNDS_NO_KEY_DATA);
|
|
118
|
+
builder.key(key);
|
|
119
|
+
const result = builder.signAndBuild(`${coin.chainId}`);
|
|
120
|
+
should_1.default.equal(result, testData.SEND_FUNDS_DATA);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zZmVyQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1Qiw0Q0FBMEU7QUFDMUUsbUNBQXFEO0FBQ3JELDJEQUE2QztBQUU3QyxRQUFRLENBQUMsNEJBQTRCLEVBQUU7SUFDckMsTUFBTSxTQUFTLEdBQUcsNENBQTRDLENBQUM7SUFDL0QsTUFBTSxJQUFJLEdBQ1IsaUhBQWlILENBQUM7SUFDcEgsTUFBTSxHQUFHLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFhLENBQUM7SUFDL0QsTUFBTSxNQUFNLEdBQUcsb0JBQW9CLENBQUMsQ0FBQywwQkFBMEI7SUFDL0QsTUFBTSxJQUFJLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQThCLENBQUM7SUFDN0QsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7UUFDNUIsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUkscUJBQWUsRUFBRTtpQkFDbEMsY0FBYyxDQUFDLFVBQVUsQ0FBQztpQkFDMUIsTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDZCxFQUFFLENBQUMsU0FBUyxDQUFDO2lCQUNiLGtCQUFrQixDQUFDLENBQUMsQ0FBQztpQkFDckIsR0FBRyxDQUFDLEdBQUcsQ0FBQztpQkFDUixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDZCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDdkQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFB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MUIsTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDZCxFQUFFLENBQUMsU0FBUyxDQUFDO2lCQUNiLGtCQUFrQixDQUFDLENBQUMsQ0FBQztpQkFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnREFBZ0QsRUFBRSxHQUFHLEVBQUU7WUFDeEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxxQkFBZSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3JFLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgY29pbnMsIEV0aGVyZXVtTmV0d29yayBhcyBFdGhMaWtlTmV0d29yayB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IEtleVBhaXIsIFRyYW5zZmVyQnVpbGRlciB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMvZXRoJztcblxuZGVzY3JpYmUoJ0V0aCBzZW5kIG11bHRpIHNpZyBidWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCB0b0FkZHJlc3MgPSAnMHg3MzI1QTNGN2Q0ZjlFODZBRTYyQ2Y3NDI0MjYwNzhDMzc1NTczMGQ1JztcbiAgY29uc3QgeHBydiA9XG4gICAgJ3hwcnY5czIxWnJRSDE0M0szRDhUWGZ2QUpnSFZmVEVlUU5XNVlzOXdadG5VWmtxUHpGelNqYkVKcldDMXZaNEduWEN2UjdyUUwyVUZYM1JTdVllVTlNckVSbTFYQnZBQ293N2MzNnZuejVpWXlqMic7XG4gIGNvbnN0IGtleSA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB4cHJ2IH0pLmdldEtleXMoKS5wcnYgYXMgc3RyaW5nO1xuICBjb25zdCBhbW91bnQgPSAnMTAwMDAwMDAwMDAwMDAwMDAwJzsgLy8gZXF1aXZhbGVudCB0byAwLjEgZXRoZXJcbiAgY29uc3QgY29pbiA9IGNvaW5zLmdldCgnaHRldGgnKSBhcyB1bmtub3duIGFzIEV0aExpa2VOZXR3b3JrO1xuICBkZXNjcmliZSgnc2hvdWxkIGJ1aWxkJywgKCkgPT4ge1xuICAgIGl0KCduYXRpdmUgY29pbiB0cmFuc2ZlciBzaG91bGQgc3VjY2VlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgLmV4cGlyYXRpb25UaW1lKDE1OTAwNzgyNjApXG4gICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAudG8odG9BZGRyZXNzKVxuICAgICAgICAuY29udHJhY3RTZXF1ZW5jZUlkKDIpXG4gICAgICAgIC5rZXkoa2V5KVxuICAgICAgICAuZGF0YSgnMHgnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIuc2lnbkFuZEJ1aWxkKGAke2NvaW4uY2hhaW5JZH1gKTtcbiAgICAgIHNob3VsZC5lcXVhbChyZXN1bHQsIHRlc3REYXRhLlNFTkRfRlVORFNfREFUQSk7XG4gICAgfSk7XG5cbiAgICBpdCgnbmF0aXZlIGNvaW4gdHJhbnNmZXIgd2l0aCBjb2luIGV4cGxpY2l0bHkgc2V0IHNob3VsZCBzdWNjZWVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAuZXhwaXJhdGlvblRpbWUoMTU5MDA3ODI2MClcbiAgICAgICAgLmNvaW4oJ2V0aCcpXG4gICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAudG8odG9BZGRyZXNzKVxuICAgICAgICAuY29udHJhY3RTZXF1ZW5jZUlkKDIpXG4gICAgICAgIC5rZXkoa2V5KVxuICAgICAgICAuZGF0YSgnMHgnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIuc2lnbkFuZEJ1aWxkKGAke2NvaW4uY2hhaW5JZH1gKTtcbiAgICAgIHNob3VsZC5lcXVhbChyZXN1bHQsIHRlc3REYXRhLlNFTkRfRlVORFNfREFUQSk7XG4gICAgfSk7XG5cbiAgICBpdCgnbmF0aXZlIGNvaW4gdHJhbnNmZXIgd2l0aCBzZXF1ZW5jZUlkIHplcm8gc2hvdWxkIHN1Y2NlZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5leHBpcmF0aW9uVGltZSgxNTkwMDc4MjYwKVxuICAgICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgICAgLnRvKHRvQWRkcmVzcylcbiAgICAgICAgLmNvbnRyYWN0U2VxdWVuY2VJZCgwKVxuICAgICAgICAua2V5KGtleSlcbiAgICAgICAgLmRhdGEoJzB4Jyk7XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLnNpZ25BbmRCdWlsZChgJHtjb2luLmNoYWluSWR9YCk7XG4gICAgICBzaG91bGQuZXF1YWwocmVzdWx0LCB0ZXN0RGF0YS5TRU5EX0ZVTkRTX1NFUVVFTkNFX1pFUk9fREFUQSk7XG4gICAgfSk7XG5cbiAgICBpdCgnbmF0aXZlIGNvaW4gdHJhbnNmZXIgd2l0aCBhbW91bnQgMCBzaG91bGQgc3VjY2VlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgLmV4cGlyYXRpb25UaW1lKDE1OTAwNzgyNjApXG4gICAgICAgIC5hbW91bnQoJzAnKVxuICAgICAgICAudG8odG9BZGRyZXNzKVxuICAgICAgICAuY29udHJhY3RTZXF1ZW5jZUlkKDIpXG4gICAgICAgIC5rZXkoa2V5KVxuICAgICAgICAuZGF0YSgnMHgnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIuc2lnbkFuZEJ1aWxkKGAke2NvaW4uY2hhaW5JZH1gKTtcbiAgICAgIHNob3VsZC5lcXVhbChyZXN1bHQsIHRlc3REYXRhLlNFTkRfRlVORFNfQU1PVU5UX1pFUk9fREFUQSk7XG4gICAgfSk7XG5cbiAgICBpdCgnRVJDMjAgdG9rZW4gdHJhbnNmZXIgc2hvdWxkIHN1Y2NlZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5jb2luKCd0ZXJjJylcbiAgICAgICAgLmV4cGlyYXRpb25UaW1lKDE1OTAwNzgyNjApXG4gICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAudG8odG9BZGRyZXNzKVxuICAgICAgICAuY29udHJhY3RTZXF1ZW5jZUlkKDIpXG4gICAgICAgIC5rZXkoa2V5KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIuc2lnbkFuZEJ1aWxkKGAke2NvaW4uY2hhaW5JZH1gKTtcbiAgICAgIHNob3VsZC5lcXVhbChyZXN1bHQsIHRlc3REYXRhLlNFTkRfVEVSQ19EQVRBKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgd2l0aG91dCBhIHNpZ25hdHVyZSBzZXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5leHBpcmF0aW9uVGltZSgxNTkwMDc4MjYwKVxuICAgICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgICAgLnRvKHRvQWRkcmVzcylcbiAgICAgICAgLmNvbnRyYWN0U2VxdWVuY2VJZCgyKVxuICAgICAgICAuZGF0YSgnMHgnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIuc2lnbkFuZEJ1aWxkKGAke2NvaW4uY2hhaW5JZH1gKTtcbiAgICAgIHNob3VsZC5lcXVhbChyZXN1bHQsIHRlc3REYXRhLlNFTkRfRlVORFNfTk9fS0VZX0RBVEEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBmcm9tIGEgbm9uIHNpZ25lZCBzZXJpYWxpemVkIGRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlcih0ZXN0RGF0YS5TRU5EX0ZVTkRTX05PX0tFWV9EQVRBKTtcbiAgICAgIGJ1aWxkZXIua2V5KGtleSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLnNpZ25BbmRCdWlsZChgJHtjb2luLmNoYWluSWR9YCk7XG4gICAgICBzaG91bGQuZXF1YWwocmVzdWx0LCB0ZXN0RGF0YS5TRU5EX0ZVTkRTX0RBVEEpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../test/unit/utils.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const should_1 = __importDefault(require("should"));
|
|
40
|
+
const src_1 = require("../../src");
|
|
41
|
+
const testData = __importStar(require("../resources/eth"));
|
|
42
|
+
const ethereumjs_util_1 = require("ethereumjs-util");
|
|
43
|
+
const ethereumjs_abi_1 = __importDefault(require("ethereumjs-abi"));
|
|
44
|
+
describe('ETH util library', function () {
|
|
45
|
+
describe('sign operation', function () {
|
|
46
|
+
it('should return a correct signed transaction', async () => {
|
|
47
|
+
const SIGNATURE = await (0, src_1.sign)(testData.LEGACY_TXDATA, testData.KEYPAIR_PRV);
|
|
48
|
+
should_1.default.equal(SIGNATURE, testData.ENCODED_LEGACY_TRANSACTION);
|
|
49
|
+
});
|
|
50
|
+
it('should fail with missing prv key', function () {
|
|
51
|
+
(0, src_1.sign)(testData.LEGACY_TXDATA, testData.KEYPAIR_PUB).should.be.rejectedWith(new RegExp('Missing private key'));
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
it('Should validate valid createForwarder Id for forwarder', function () {
|
|
55
|
+
should_1.default.equal((0, src_1.getAddressInitializationData)(), src_1.createForwarderMethodId);
|
|
56
|
+
});
|
|
57
|
+
it('should validate valid address', function () {
|
|
58
|
+
should_1.default.equal((0, src_1.isValidEthAddress)(testData.ACCOUNT_1), true);
|
|
59
|
+
});
|
|
60
|
+
it('should validate invalid address', function () {
|
|
61
|
+
should_1.default.equal((0, src_1.isValidEthAddress)(testData.INVALID_ACCOUNT), false);
|
|
62
|
+
});
|
|
63
|
+
it('should generate a proper address', function () {
|
|
64
|
+
should_1.default.equal((0, src_1.calculateForwarderAddress)(testData.CONTRACT_ADDRESS, 1), '0x016e4eee27f3f355bbb78d0e5eb813c4761822c9');
|
|
65
|
+
});
|
|
66
|
+
it('should generate a proper forwarder version 1 address', function () {
|
|
67
|
+
const initCode = (0, src_1.getProxyInitcode)(testData.FORWARDER_IMPLEMENTATION_ADDRESS);
|
|
68
|
+
const saltBuffer = (0, ethereumjs_util_1.setLengthLeft)(Buffer.from('02', 'hex'), 32);
|
|
69
|
+
// Hash the wallet base address with the given salt, so the address directly relies on the base address
|
|
70
|
+
const calculationSalt = (0, ethereumjs_util_1.bufferToHex)(ethereumjs_abi_1.default.soliditySHA3(['address', 'bytes32'], [testData.BASE_ADDRESS, saltBuffer]));
|
|
71
|
+
should_1.default.equal((0, src_1.calculateForwarderV1Address)(testData.FORWARDER_FACTORY_ADDRESS, calculationSalt, initCode), '0x7cdc37afc70221410bea40ce3b62c2f7bf383890');
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsbUNBUW1CO0FBQ25CLDJEQUE2QztBQUM3QyxxREFBNkQ7QUFDN0Qsb0VBQXlDO0FBRXpDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtJQUMzQixRQUFRLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzFELE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBQSxVQUFJLEVBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0UsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtDQUFrQyxFQUFFO1lBQ3JDLElBQUEsVUFBSSxFQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQztRQUMvRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHdEQUF3RCxFQUFFO1FBQzNELGdCQUFNLENBQUMsS0FBSyxDQUFDLElBQUEsa0NBQTRCLEdBQUUsRUFBRSw2QkFBdUIsQ0FBQyxDQUFDO0lBQ3hFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLCtCQUErQixFQUFFO1FBQ2xDLGdCQUFNLENBQUMsS0FBSyxDQUFDLElBQUEsdUJBQWlCLEVBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzVELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGlDQUFpQyxFQUFFO1FBQ3BDLGdCQUFNLENBQUMsS0FBSyxDQUFDLElBQUEsdUJBQWlCLEVBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGtDQUFrQyxFQUFFO1FBQ3JDLGdCQUFNLENBQUMsS0FBSyxDQUFDLElBQUEsK0JBQXlCLEVBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxFQUFFLDRDQUE0QyxDQUFDLENBQUM7SUFDdEgsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsc0RBQXNELEVBQUU7UUFDekQsTUFBTSxRQUFRLEdBQUcsSUFBQSxzQkFBZ0IsRUFBQyxRQUFRLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUM3RSxNQUFNLFVBQVUsR0FBRyxJQUFBLCtCQUFhLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFL0QsdUdBQXVHO1FBQ3ZHLE1BQU0sZUFBZSxHQUFHLElBQUEsNkJBQVcsRUFDakMsd0JBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQ3RGLENBQUM7UUFDRixnQkFBTSxDQUFDLEtBQUssQ0FDVixJQUFBLGlDQUEyQixFQUFDLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxlQUFlLEVBQUUsUUFBUSxDQUFDLEVBQzFGLDRDQUE0QyxDQUM3QyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7XG4gIHNpZ24sXG4gIGlzVmFsaWRFdGhBZGRyZXNzLFxuICBnZXRBZGRyZXNzSW5pdGlhbGl6YXRpb25EYXRhLFxuICBjYWxjdWxhdGVGb3J3YXJkZXJBZGRyZXNzLFxuICBjYWxjdWxhdGVGb3J3YXJkZXJWMUFkZHJlc3MsXG4gIGdldFByb3h5SW5pdGNvZGUsXG4gIGNyZWF0ZUZvcndhcmRlck1ldGhvZElkLFxufSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL2V0aCc7XG5pbXBvcnQgeyBidWZmZXJUb0hleCwgc2V0TGVuZ3RoTGVmdCB9IGZyb20gJ2V0aGVyZXVtanMtdXRpbCc7XG5pbXBvcnQgRXRoZXJldW1BYmkgZnJvbSAnZXRoZXJldW1qcy1hYmknO1xuXG5kZXNjcmliZSgnRVRIIHV0aWwgbGlicmFyeScsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ3NpZ24gb3BlcmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgY29ycmVjdCBzaWduZWQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBTSUdOQVRVUkUgPSBhd2FpdCBzaWduKHRlc3REYXRhLkxFR0FDWV9UWERBVEEsIHRlc3REYXRhLktFWVBBSVJfUFJWKTtcbiAgICAgIHNob3VsZC5lcXVhbChTSUdOQVRVUkUsIHRlc3REYXRhLkVOQ09ERURfTEVHQUNZX1RSQU5TQUNUSU9OKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIG1pc3NpbmcgcHJ2IGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNpZ24odGVzdERhdGEuTEVHQUNZX1RYREFUQSwgdGVzdERhdGEuS0VZUEFJUl9QVUIpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgobmV3IFJlZ0V4cCgnTWlzc2luZyBwcml2YXRlIGtleScpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ1Nob3VsZCB2YWxpZGF0ZSB2YWxpZCBjcmVhdGVGb3J3YXJkZXIgSWQgZm9yIGZvcndhcmRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBzaG91bGQuZXF1YWwoZ2V0QWRkcmVzc0luaXRpYWxpemF0aW9uRGF0YSgpLCBjcmVhdGVGb3J3YXJkZXJNZXRob2RJZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgdmFsaWQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBzaG91bGQuZXF1YWwoaXNWYWxpZEV0aEFkZHJlc3ModGVzdERhdGEuQUNDT1VOVF8xKSwgdHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgaW52YWxpZCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIHNob3VsZC5lcXVhbChpc1ZhbGlkRXRoQWRkcmVzcyh0ZXN0RGF0YS5JTlZBTElEX0FDQ09VTlQpLCBmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgYSBwcm9wZXIgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBzaG91bGQuZXF1YWwoY2FsY3VsYXRlRm9yd2FyZGVyQWRkcmVzcyh0ZXN0RGF0YS5DT05UUkFDVF9BRERSRVNTLCAxKSwgJzB4MDE2ZTRlZWUyN2YzZjM1NWJiYjc4ZDBlNWViODEzYzQ3NjE4MjJjOScpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEgcHJvcGVyIGZvcndhcmRlciB2ZXJzaW9uIDEgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBpbml0Q29kZSA9IGdldFByb3h5SW5pdGNvZGUodGVzdERhdGEuRk9SV0FSREVSX0lNUExFTUVOVEFUSU9OX0FERFJFU1MpO1xuICAgIGNvbnN0IHNhbHRCdWZmZXIgPSBzZXRMZW5ndGhMZWZ0KEJ1ZmZlci5mcm9tKCcwMicsICdoZXgnKSwgMzIpO1xuXG4gICAgLy8gSGFzaCB0aGUgd2FsbGV0IGJhc2UgYWRkcmVzcyB3aXRoIHRoZSBnaXZlbiBzYWx0LCBzbyB0aGUgYWRkcmVzcyBkaXJlY3RseSByZWxpZXMgb24gdGhlIGJhc2UgYWRkcmVzc1xuICAgIGNvbnN0IGNhbGN1bGF0aW9uU2FsdCA9IGJ1ZmZlclRvSGV4KFxuICAgICAgRXRoZXJldW1BYmkuc29saWRpdHlTSEEzKFsnYWRkcmVzcycsICdieXRlczMyJ10sIFt0ZXN0RGF0YS5CQVNFX0FERFJFU1MsIHNhbHRCdWZmZXJdKVxuICAgICk7XG4gICAgc2hvdWxkLmVxdWFsKFxuICAgICAgY2FsY3VsYXRlRm9yd2FyZGVyVjFBZGRyZXNzKHRlc3REYXRhLkZPUldBUkRFUl9GQUNUT1JZX0FERFJFU1MsIGNhbGN1bGF0aW9uU2FsdCwgaW5pdENvZGUpLFxuICAgICAgJzB4N2NkYzM3YWZjNzAyMjE0MTBiZWE0MGNlM2I2MmMyZjdiZjM4Mzg5MCdcbiAgICApO1xuICB9KTtcbn0pO1xuIl19
|