@bitgo-beta/sdk-coin-eth 4.4.1-beta.192 → 4.4.1-beta.1920
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/src/erc20Token.d.ts +1 -1
- package/dist/src/erc20Token.d.ts.map +1 -1
- package/dist/src/erc20Token.js +49 -28
- package/dist/src/erc721Token.d.ts +60 -0
- package/dist/src/erc721Token.d.ts.map +1 -0
- package/dist/src/erc721Token.js +334 -0
- package/dist/src/erc7984Token.d.ts +118 -0
- package/dist/src/erc7984Token.d.ts.map +1 -0
- package/dist/src/erc7984Token.js +459 -0
- package/dist/src/eth.d.ts +10 -8
- package/dist/src/eth.d.ts.map +1 -1
- package/dist/src/eth.js +54 -39
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +8 -2
- package/dist/src/lib/index.d.ts +1 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +7 -2
- package/dist/src/lib/messages/index.d.ts +3 -0
- package/dist/src/lib/messages/index.d.ts.map +1 -0
- package/dist/src/lib/messages/index.js +6 -0
- package/dist/src/lib/transactionBuilder.d.ts +10 -5
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +17 -7
- package/dist/src/lib/transferBuilders/index.d.ts +2 -2
- package/dist/src/lib/transferBuilders/index.d.ts.map +1 -1
- package/dist/src/lib/transferBuilders/index.js +3 -2
- package/dist/src/register.d.ts +2 -0
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +36 -2
- 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/erc7984Token.d.ts +2 -0
- package/dist/test/unit/erc7984Token.d.ts.map +1 -0
- package/dist/test/unit/erc7984Token.js +1034 -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 +2568 -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 +552 -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/register.d.ts +2 -0
- package/dist/test/unit/register.d.ts.map +1 -0
- package/dist/test/unit/register.js +73 -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 +117 -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/decryptionDelegation.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/decryptionDelegation.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/decryptionDelegation.js +59 -0
- package/dist/test/unit/transactionBuilder/decryptionDelegationTxBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/decryptionDelegationTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/decryptionDelegationTxBuilder.js +136 -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 +285 -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/sendERC7984Token.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/sendERC7984Token.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/sendERC7984Token.js +361 -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 +295 -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 +436 -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 +17 -13
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -717
|
@@ -0,0 +1,334 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.Erc721Token = void 0;
|
|
37
|
+
/**
|
|
38
|
+
* @prettier
|
|
39
|
+
*/
|
|
40
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
41
|
+
const bignumber_js_1 = require("bignumber.js");
|
|
42
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
43
|
+
const secp256k1_1 = require("@bitgo-beta/secp256k1");
|
|
44
|
+
const _ = __importStar(require("lodash"));
|
|
45
|
+
const eth_1 = require("./eth");
|
|
46
|
+
const lib_1 = require("./lib");
|
|
47
|
+
class Erc721Token extends eth_1.Eth {
|
|
48
|
+
constructor(bitgo, tokenConfig) {
|
|
49
|
+
const staticsCoin = statics_1.coins.get(Erc721Token.coinNames[tokenConfig.network]);
|
|
50
|
+
super(bitgo, staticsCoin);
|
|
51
|
+
this.tokenConfig = tokenConfig;
|
|
52
|
+
this.sendMethodName = 'sendMultiSigToken';
|
|
53
|
+
}
|
|
54
|
+
static createTokenConstructor(config) {
|
|
55
|
+
return (bitgo) => new Erc721Token(bitgo, config);
|
|
56
|
+
}
|
|
57
|
+
static createTokenConstructors(tokenConfigs = [...statics_1.tokens.bitcoin.eth.nfts, ...statics_1.tokens.testnet.eth.nfts]) {
|
|
58
|
+
const tokensCtors = [];
|
|
59
|
+
for (const token of tokenConfigs) {
|
|
60
|
+
const tokenConstructor = Erc721Token.createTokenConstructor(token);
|
|
61
|
+
tokensCtors.push({ name: token.type, coinConstructor: tokenConstructor });
|
|
62
|
+
tokensCtors.push({ name: token.tokenContractAddress, coinConstructor: tokenConstructor });
|
|
63
|
+
}
|
|
64
|
+
return tokensCtors;
|
|
65
|
+
}
|
|
66
|
+
get type() {
|
|
67
|
+
return this.tokenConfig.type;
|
|
68
|
+
}
|
|
69
|
+
get name() {
|
|
70
|
+
return this.tokenConfig.name;
|
|
71
|
+
}
|
|
72
|
+
get coin() {
|
|
73
|
+
return this.tokenConfig.coin;
|
|
74
|
+
}
|
|
75
|
+
get network() {
|
|
76
|
+
return this.tokenConfig.network;
|
|
77
|
+
}
|
|
78
|
+
get tokenContractAddress() {
|
|
79
|
+
return this.tokenConfig.tokenContractAddress;
|
|
80
|
+
}
|
|
81
|
+
get decimalPlaces() {
|
|
82
|
+
return this.tokenConfig.decimalPlaces;
|
|
83
|
+
}
|
|
84
|
+
getChain() {
|
|
85
|
+
return this.tokenConfig.type;
|
|
86
|
+
}
|
|
87
|
+
getFullName() {
|
|
88
|
+
return 'ERC721 Token';
|
|
89
|
+
}
|
|
90
|
+
getBaseFactor() {
|
|
91
|
+
return Math.pow(10, this.tokenConfig.decimalPlaces);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Flag for sending value of 0
|
|
95
|
+
* @returns {boolean} True if okay to send 0 value, false otherwise
|
|
96
|
+
*/
|
|
97
|
+
valuelessTransferAllowed() {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Flag for sending data along with transactions
|
|
102
|
+
* @returns {boolean} True if okay to send tx data (ETH), false otherwise
|
|
103
|
+
*/
|
|
104
|
+
transactionDataAllowed() {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
/** @inheritDoc */
|
|
108
|
+
supportsTss() {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
/** @inheritDoc */
|
|
112
|
+
getMPCAlgorithm() {
|
|
113
|
+
return 'ecdsa';
|
|
114
|
+
}
|
|
115
|
+
getTransactionBuilder() {
|
|
116
|
+
return new lib_1.TransactionBuilder(statics_1.coins.get(this.getBaseChain()));
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Builds a token recovery transaction without BitGo
|
|
120
|
+
* @param params
|
|
121
|
+
* @param params.userKey {String} [encrypted] xprv
|
|
122
|
+
* @param params.backupKey {String} [encrypted] xprv or xpub if the xprv is held by a KRS providers
|
|
123
|
+
* @param params.walletPassphrase {String} used to decrypt userKey and backupKey
|
|
124
|
+
* @param params.walletContractAddress {String} the ETH address of the wallet contract
|
|
125
|
+
* @param params.recoveryDestination {String} target address to send recovered funds to
|
|
126
|
+
* @param params.krsProvider {String} necessary if backup key is held by KRS
|
|
127
|
+
*/
|
|
128
|
+
async recover(params) {
|
|
129
|
+
if (_.isUndefined(params.userKey)) {
|
|
130
|
+
throw new Error('missing userKey');
|
|
131
|
+
}
|
|
132
|
+
if (_.isUndefined(params.backupKey)) {
|
|
133
|
+
throw new Error('missing backupKey');
|
|
134
|
+
}
|
|
135
|
+
if (_.isUndefined(params.walletPassphrase) && !params.userKey.startsWith('xpub')) {
|
|
136
|
+
throw new Error('missing wallet passphrase');
|
|
137
|
+
}
|
|
138
|
+
if (_.isUndefined(params.walletContractAddress) || !this.isValidAddress(params.walletContractAddress)) {
|
|
139
|
+
throw new Error('invalid walletContractAddress');
|
|
140
|
+
}
|
|
141
|
+
if (_.isUndefined(params.recoveryDestination) || !this.isValidAddress(params.recoveryDestination)) {
|
|
142
|
+
throw new Error('invalid recoveryDestination');
|
|
143
|
+
}
|
|
144
|
+
const isKrsRecovery = (0, sdk_core_1.getIsKrsRecovery)(params);
|
|
145
|
+
const isUnsignedSweep = (0, sdk_core_1.getIsUnsignedSweep)(params);
|
|
146
|
+
if (isKrsRecovery) {
|
|
147
|
+
(0, sdk_core_1.checkKrsProvider)(this, params.krsProvider, { checkCoinFamilySupport: false });
|
|
148
|
+
}
|
|
149
|
+
// Clean up whitespace from entered values
|
|
150
|
+
const userKey = params.userKey.replace(/\s/g, '');
|
|
151
|
+
const backupKey = params.backupKey.replace(/\s/g, '');
|
|
152
|
+
// Set new eth tx fees (default to using platform values if none are provided)
|
|
153
|
+
const gasPrice = params.eip1559
|
|
154
|
+
? new eth_1.optionalDeps.ethUtil.BN(params.eip1559.maxFeePerGas)
|
|
155
|
+
: new eth_1.optionalDeps.ethUtil.BN(this.setGasPrice(params.gasPrice));
|
|
156
|
+
const gasLimit = new eth_1.optionalDeps.ethUtil.BN(this.setGasLimit(params.gasLimit));
|
|
157
|
+
// Decrypt private keys from KeyCard values
|
|
158
|
+
let userPrv;
|
|
159
|
+
if (!userKey.startsWith('xpub') && !userKey.startsWith('xprv')) {
|
|
160
|
+
try {
|
|
161
|
+
userPrv = await this.bitgo.decrypt({
|
|
162
|
+
input: userKey,
|
|
163
|
+
password: params.walletPassphrase,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
catch (e) {
|
|
167
|
+
throw new Error(`Error decrypting user keychain: ${e.message}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
let backupKeyAddress;
|
|
171
|
+
let backupSigningKey;
|
|
172
|
+
if (isKrsRecovery || isUnsignedSweep) {
|
|
173
|
+
const backupHDNode = secp256k1_1.bip32.fromBase58(backupKey);
|
|
174
|
+
backupSigningKey = backupHDNode.publicKey;
|
|
175
|
+
backupKeyAddress = `0x${eth_1.optionalDeps.ethUtil.publicToAddress(backupSigningKey, true).toString('hex')}`;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
let backupPrv;
|
|
179
|
+
try {
|
|
180
|
+
backupPrv = await this.bitgo.decrypt({
|
|
181
|
+
input: backupKey,
|
|
182
|
+
password: params.walletPassphrase,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
catch (e) {
|
|
186
|
+
throw new Error(`Error decrypting backup keychain: ${e.message}`);
|
|
187
|
+
}
|
|
188
|
+
const backupHDNode = secp256k1_1.bip32.fromBase58(backupPrv);
|
|
189
|
+
backupSigningKey = backupHDNode.privateKey;
|
|
190
|
+
backupKeyAddress = `0x${eth_1.optionalDeps.ethUtil.privateToAddress(backupSigningKey).toString('hex')}`;
|
|
191
|
+
}
|
|
192
|
+
// Get nonce for backup key (should be 0)
|
|
193
|
+
let backupKeyNonce = 0;
|
|
194
|
+
const result = await this.recoveryBlockchainExplorerQuery({
|
|
195
|
+
chainid: this.getChainId().toString(),
|
|
196
|
+
module: 'account',
|
|
197
|
+
action: 'txlist',
|
|
198
|
+
address: backupKeyAddress,
|
|
199
|
+
}, params.apiKey);
|
|
200
|
+
const backupKeyTxList = result.result;
|
|
201
|
+
if (backupKeyTxList.length > 0) {
|
|
202
|
+
// Calculate last nonce used
|
|
203
|
+
const outgoingTxs = backupKeyTxList.filter((tx) => tx.from === backupKeyAddress);
|
|
204
|
+
backupKeyNonce = outgoingTxs.length;
|
|
205
|
+
}
|
|
206
|
+
// get balance of backup key and make sure we can afford gas
|
|
207
|
+
const backupKeyBalance = await this.queryAddressBalance(backupKeyAddress, params.apiKey);
|
|
208
|
+
if (backupKeyBalance.lt(gasPrice.mul(gasLimit))) {
|
|
209
|
+
throw new Error(`Backup key address ${backupKeyAddress} has balance ${backupKeyBalance.toString(10)}. This address must have a balance of at least 0.01 ETH to perform recoveries`);
|
|
210
|
+
}
|
|
211
|
+
// get token balance of wallet
|
|
212
|
+
const txAmount = await this.queryAddressTokenBalance(this.tokenContractAddress, params.walletContractAddress, params.apiKey);
|
|
213
|
+
if (new bignumber_js_1.BigNumber(txAmount).isLessThanOrEqualTo(0)) {
|
|
214
|
+
throw new Error('Wallet does not have enough funds to recover');
|
|
215
|
+
}
|
|
216
|
+
// build recipients object
|
|
217
|
+
const recipients = [
|
|
218
|
+
{
|
|
219
|
+
address: params.recoveryDestination,
|
|
220
|
+
amount: txAmount.toString(10),
|
|
221
|
+
},
|
|
222
|
+
];
|
|
223
|
+
// Get sequence ID using contract call
|
|
224
|
+
const sequenceId = await this.querySequenceId(params.walletContractAddress, params.apiKey);
|
|
225
|
+
let operationHash, signature;
|
|
226
|
+
if (!isUnsignedSweep) {
|
|
227
|
+
// Get operation hash and sign it
|
|
228
|
+
operationHash = this.getOperationSha3ForExecuteAndConfirm(recipients, this.getDefaultExpireTime(), sequenceId);
|
|
229
|
+
signature = sdk_core_1.Util.ethSignMsgHash(operationHash, sdk_core_1.Util.xprvToEthPrivateKey(userPrv));
|
|
230
|
+
try {
|
|
231
|
+
sdk_core_1.Util.ecRecoverEthAddress(operationHash, signature);
|
|
232
|
+
}
|
|
233
|
+
catch (e) {
|
|
234
|
+
throw new Error('Invalid signature');
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
const txInfo = {
|
|
238
|
+
recipient: recipients[0],
|
|
239
|
+
expireTime: this.getDefaultExpireTime(),
|
|
240
|
+
contractSequenceId: sequenceId,
|
|
241
|
+
signature: signature,
|
|
242
|
+
gasLimit: gasLimit.toString(10),
|
|
243
|
+
tokenContractAddress: this.tokenContractAddress,
|
|
244
|
+
};
|
|
245
|
+
// calculate send data
|
|
246
|
+
const sendMethodArgs = this.getSendMethodArgs(txInfo);
|
|
247
|
+
const methodSignature = eth_1.optionalDeps.ethAbi.methodID(this.sendMethodName, _.map(sendMethodArgs, 'type'));
|
|
248
|
+
const encodedArgs = eth_1.optionalDeps.ethAbi.rawEncode(_.map(sendMethodArgs, 'type'), _.map(sendMethodArgs, 'value'));
|
|
249
|
+
const sendData = Buffer.concat([methodSignature, encodedArgs]);
|
|
250
|
+
let tx = eth_1.Eth.buildTransaction({
|
|
251
|
+
to: params.walletContractAddress,
|
|
252
|
+
nonce: backupKeyNonce,
|
|
253
|
+
value: 0,
|
|
254
|
+
gasPrice: gasPrice,
|
|
255
|
+
gasLimit: gasLimit,
|
|
256
|
+
data: sendData,
|
|
257
|
+
eip1559: params.eip1559,
|
|
258
|
+
replayProtectionOptions: params.replayProtectionOptions,
|
|
259
|
+
});
|
|
260
|
+
if (isUnsignedSweep) {
|
|
261
|
+
return this.formatForOfflineVault(txInfo, tx, userKey, backupKey, gasPrice, gasLimit, params.eip1559, params.replayProtectionOptions, params.apiKey);
|
|
262
|
+
}
|
|
263
|
+
if (!isKrsRecovery) {
|
|
264
|
+
tx = tx.sign(backupSigningKey);
|
|
265
|
+
}
|
|
266
|
+
const signedTx = {
|
|
267
|
+
id: eth_1.optionalDeps.ethUtil.bufferToHex(tx.hash()),
|
|
268
|
+
tx: tx.serialize().toString('hex'),
|
|
269
|
+
};
|
|
270
|
+
if (isKrsRecovery) {
|
|
271
|
+
signedTx.backupKey = backupKey;
|
|
272
|
+
signedTx.coin = 'erc721';
|
|
273
|
+
}
|
|
274
|
+
return signedTx;
|
|
275
|
+
}
|
|
276
|
+
getOperation(recipient, expireTime, contractSequenceId) {
|
|
277
|
+
return [
|
|
278
|
+
['string', 'address', 'uint', 'address', 'uint', 'uint'],
|
|
279
|
+
[
|
|
280
|
+
'ERC721',
|
|
281
|
+
new eth_1.optionalDeps.ethUtil.BN(eth_1.optionalDeps.ethUtil.stripHexPrefix(recipient.address), 16),
|
|
282
|
+
recipient.amount,
|
|
283
|
+
new eth_1.optionalDeps.ethUtil.BN(eth_1.optionalDeps.ethUtil.stripHexPrefix(this.tokenContractAddress), 16),
|
|
284
|
+
expireTime,
|
|
285
|
+
contractSequenceId,
|
|
286
|
+
],
|
|
287
|
+
];
|
|
288
|
+
}
|
|
289
|
+
getSendMethodArgs(txInfo) {
|
|
290
|
+
// Method signature is
|
|
291
|
+
// sendMultiSigToken(address toAddress, uint value, address tokenContractAddress, uint expireTime, uint sequenceId, bytes signature)
|
|
292
|
+
return [
|
|
293
|
+
{
|
|
294
|
+
name: 'toAddress',
|
|
295
|
+
type: 'address',
|
|
296
|
+
value: txInfo.recipient.address,
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
name: 'value',
|
|
300
|
+
type: 'uint',
|
|
301
|
+
value: txInfo.recipient.amount,
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
name: 'tokenContractAddress',
|
|
305
|
+
type: 'address',
|
|
306
|
+
value: this.tokenContractAddress,
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
name: 'expireTime',
|
|
310
|
+
type: 'uint',
|
|
311
|
+
value: txInfo.expireTime,
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
name: 'sequenceId',
|
|
315
|
+
type: 'uint',
|
|
316
|
+
value: txInfo.contractSequenceId,
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
name: 'signature',
|
|
320
|
+
type: 'bytes',
|
|
321
|
+
value: eth_1.optionalDeps.ethUtil.toBuffer(eth_1.optionalDeps.ethUtil.addHexPrefix(txInfo.signature)),
|
|
322
|
+
},
|
|
323
|
+
];
|
|
324
|
+
}
|
|
325
|
+
verifyCoin(txPrebuild) {
|
|
326
|
+
return txPrebuild.coin === this.tokenConfig.coin && txPrebuild.token === this.tokenConfig.type;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
exports.Erc721Token = Erc721Token;
|
|
330
|
+
Erc721Token.coinNames = {
|
|
331
|
+
Mainnet: 'eth',
|
|
332
|
+
Testnet: 'hteth',
|
|
333
|
+
};
|
|
334
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJjNzIxVG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXJjNzIxVG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCxtREFTOEI7QUFDOUIsK0NBQXlDO0FBRXpDLGlEQUF3RTtBQUV4RSxxREFBOEM7QUFDOUMsMENBQTRCO0FBRTVCLCtCQUE2RjtBQUM3RiwrQkFBMkM7QUFHM0MsTUFBYSxXQUFZLFNBQVEsU0FBRztJQVFsQyxZQUFZLEtBQWdCLEVBQUUsV0FBK0I7UUFDM0QsTUFBTSxXQUFXLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQztJQUM1QyxDQUFDO0lBRUQsTUFBTSxDQUFDLHNCQUFzQixDQUFDLE1BQTBCO1FBQ3RELE9BQU8sQ0FBQyxLQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELE1BQU0sQ0FBQyx1QkFBdUIsQ0FDNUIsZUFBcUMsQ0FBQyxHQUFHLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBRTdGLE1BQU0sV0FBVyxHQUEyQixFQUFFLENBQUM7UUFDL0MsS0FBSyxNQUFNLEtBQUssSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQyxNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENB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QyxZQUFZLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQzFGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxVQUFVLENBQUMsVUFBK0I7UUFDeEMsT0FBTyxVQUFVLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDakcsQ0FBQzs7QUFwV0gsa0NBcVdDO0FBbFdRLHFCQUFTLEdBQWM7SUFDNUIsT0FBTyxFQUFFLEtBQUs7SUFDZCxPQUFPLEVBQUUsT0FBTztDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IHtcbiAgQml0R29CYXNlLFxuICBDb2luQ29uc3RydWN0b3IsXG4gIFV0aWwsXG4gIGNoZWNrS3JzUHJvdmlkZXIsXG4gIGdldElzS3JzUmVjb3ZlcnksXG4gIGdldElzVW5zaWduZWRTd2VlcCxcbiAgTVBDQWxnb3JpdGhtLFxuICBOYW1lZENvaW5Db25zdHJ1Y3Rvcixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmlnTnVtYmVyIH0gZnJvbSAnYmlnbnVtYmVyLmpzJztcblxuaW1wb3J0IHsgY29pbnMsIEV0aExpa2VUb2tlbkNvbmZpZywgdG9rZW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBDb2luTmFtZXMgfSBmcm9tICdAYml0Z28tYmV0YS9hYnN0cmFjdC1ldGgnO1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28tYmV0YS9zZWNwMjU2azEnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBFdGgsIFJlY292ZXJPcHRpb25zLCBSZWNvdmVyeUluZm8sIG9wdGlvbmFsRGVwcywgVHJhbnNhY3Rpb25QcmVidWlsZCB9IGZyb20gJy4vZXRoJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vbGliJztcblxuZXhwb3J0IHsgRXRoTGlrZVRva2VuQ29uZmlnIH07XG5leHBvcnQgY2xhc3MgRXJjNzIxVG9rZW4gZXh0ZW5kcyBFdGgge1xuICBwdWJsaWMgcmVhZG9ubHkgdG9rZW5Db25maWc6IEV0aExpa2VUb2tlbkNvbmZpZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbmRNZXRob2ROYW1lOiAnc2VuZE11bHRpU2lnJyB8ICdzZW5kTXVsdGlTaWdUb2tlbic7XG4gIHN0YXRpYyBjb2luTmFtZXM6IENvaW5OYW1lcyA9IHtcbiAgICBNYWlubmV0OiAnZXRoJyxcbiAgICBUZXN0bmV0OiAnaHRldGgnLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHRva2VuQ29uZmlnOiBFdGhMaWtlVG9rZW5Db25maWcpIHtcbiAgICBjb25zdCBzdGF0aWNzQ29pbiA9IGNvaW5zLmdldChFcmM3MjFUb2tlbi5jb2luTmFtZXNbdG9rZW5Db25maWcubmV0d29ya10pO1xuICAgIHN1cGVyKGJpdGdvLCBzdGF0aWNzQ29pbik7XG4gICAgdGhpcy50b2tlbkNvbmZpZyA9IHRva2VuQ29uZmlnO1xuICAgIHRoaXMuc2VuZE1ldGhvZE5hbWUgPSAnc2VuZE11bHRpU2lnVG9rZW4nO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRva2VuQ29uc3RydWN0b3IoY29uZmlnOiBFdGhMaWtlVG9rZW5Db25maWcpOiBDb2luQ29uc3RydWN0b3Ige1xuICAgIHJldHVybiAoYml0Z286IEJpdEdvQmFzZSkgPT4gbmV3IEVyYzcyMVRva2VuKGJpdGdvLCBjb25maWcpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRva2VuQ29uc3RydWN0b3JzKFxuICAgIHRva2VuQ29uZmlnczogRXRoTGlrZVRva2VuQ29uZmlnW10gPSBbLi4udG9rZW5zLmJpdGNvaW4uZXRoLm5mdHMsIC4uLnRva2Vucy50ZXN0bmV0LmV0aC5uZnRzXVxuICApOiBOYW1lZENvaW5Db25zdHJ1Y3RvcltdIHtcbiAgICBjb25zdCB0b2tlbnNDdG9yczogTmFtZWRDb2luQ29uc3RydWN0b3JbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5Db25maWdzKSB7XG4gICAgICBjb25zdCB0b2tlbkNvbnN0cnVjdG9yID0gRXJjNzIxVG9rZW4uY3JlYXRlVG9rZW5Db25zdHJ1Y3Rvcih0b2tlbik7XG4gICAgICB0b2tlbnNDdG9ycy5wdXNoKHsgbmFtZTogdG9rZW4udHlwZSwgY29pbkNvbnN0cnVjdG9yOiB0b2tlbkNvbnN0cnVjdG9yIH0pO1xuICAgICAgdG9rZW5zQ3RvcnMucHVzaCh7IG5hbWU6IHRva2VuLnRva2VuQ29udHJhY3RBZGRyZXNzLCBjb2luQ29uc3RydWN0b3I6IHRva2VuQ29uc3RydWN0b3IgfSk7XG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNDdG9ycztcbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLnR5cGU7XG4gIH1cblxuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5uYW1lO1xuICB9XG5cbiAgZ2V0IGNvaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcuY29pbjtcbiAgfVxuXG4gIGdldCBuZXR3b3JrKCkge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLm5ldHdvcms7XG4gIH1cblxuICBnZXQgdG9rZW5Db250cmFjdEFkZHJlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcudG9rZW5Db250cmFjdEFkZHJlc3M7XG4gIH1cblxuICBnZXQgZGVjaW1hbFBsYWNlcygpIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5kZWNpbWFsUGxhY2VzO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcudHlwZTtcbiAgfVxuXG4gIGdldEZ1bGxOYW1lKCkge1xuICAgIHJldHVybiAnRVJDNzIxIFRva2VuJztcbiAgfVxuXG4gIGdldEJhc2VGYWN0b3IoKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLnRva2VuQ29uZmlnLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYWcgZm9yIHNlbmRpbmcgdmFsdWUgb2YgMFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBva2F5IHRvIHNlbmQgMCB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICB2YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYWcgZm9yIHNlbmRpbmcgZGF0YSBhbG9uZyB3aXRoIHRyYW5zYWN0aW9uc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBva2F5IHRvIHNlbmQgdHggZGF0YSAoRVRIKSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICB0cmFuc2FjdGlvbkRhdGFBbGxvd2VkKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBzdXBwb3J0c1RzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBnZXRNUENBbGdvcml0aG0oKTogTVBDQWxnb3JpdGhtIHtcbiAgICByZXR1cm4gJ2VjZHNhJztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKTogVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQodGhpcy5nZXRCYXNlQ2hhaW4oKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHRva2VuIHJlY292ZXJ5IHRyYW5zYWN0aW9uIHdpdGhvdXQgQml0R29cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnVzZXJLZXkge1N0cmluZ30gW2VuY3J5cHRlZF0geHBydlxuICAgKiBAcGFyYW0gcGFyYW1zLmJhY2t1cEtleSB7U3RyaW5nfSBbZW5jcnlwdGVkXSB4cHJ2IG9yIHhwdWIgaWYgdGhlIHhwcnYgaXMgaGVsZCBieSBhIEtSUyBwcm92aWRlcnNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIHtTdHJpbmd9IHVzZWQgdG8gZGVjcnlwdCB1c2VyS2V5IGFuZCBiYWNrdXBLZXlcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3Mge1N0cmluZ30gdGhlIEVUSCBhZGRyZXNzIG9mIHRoZSB3YWxsZXQgY29udHJhY3RcbiAgICogQHBhcmFtIHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uIHtTdHJpbmd9IHRhcmdldCBhZGRyZXNzIHRvIHNlbmQgcmVjb3ZlcmVkIGZ1bmRzIHRvXG4gICAqIEBwYXJhbSBwYXJhbXMua3JzUHJvdmlkZXIge1N0cmluZ30gbmVjZXNzYXJ5IGlmIGJhY2t1cCBrZXkgaXMgaGVsZCBieSBLUlNcbiAgICovXG4gIGFzeW5jIHJlY292ZXIocGFyYW1zOiBSZWNvdmVyT3B0aW9ucyk6IFByb21pc2U8UmVjb3ZlcnlJbmZvPiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVzZXJLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdXNlcktleScpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5iYWNrdXBLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYmFja3VwS2V5Jyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpICYmICFwYXJhbXMudXNlcktleS5zdGFydHNXaXRoKCd4cHViJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB3YWxsZXQgcGFzc3BocmFzZScpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MpIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgd2FsbGV0Q29udHJhY3RBZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0tyc1JlY292ZXJ5ID0gZ2V0SXNLcnNSZWNvdmVyeShwYXJhbXMpO1xuICAgIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9IGdldElzVW5zaWduZWRTd2VlcChwYXJhbXMpO1xuXG4gICAgaWYgKGlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgIGNoZWNrS3JzUHJvdmlkZXIodGhpcywgcGFyYW1zLmtyc1Byb3ZpZGVyLCB7IGNoZWNrQ29pbkZhbWlseVN1cHBvcnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIC8vIENsZWFuIHVwIHdoaXRlc3BhY2UgZnJvbSBlbnRlcmVkIHZhbHVlc1xuICAgIGNvbnN0IHVzZXJLZXkgPSBwYXJhbXMudXNlcktleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IGJhY2t1cEtleSA9IHBhcmFtcy5iYWNrdXBLZXkucmVwbGFjZSgvXFxzL2csICcnKTtcblxuICAgIC8vIFNldCBuZXcgZXRoIHR4IGZlZXMgKGRlZmF1bHQgdG8gdXNpbmcgcGxhdGZvcm0gdmFsdWVzIGlmIG5vbmUgYXJlIHByb3ZpZGVkKVxuICAgIGNvbnN0IGdhc1ByaWNlID0gcGFyYW1zLmVpcDE1NTlcbiAgICAgID8gbmV3IG9wdGlvbmFsRGVwcy5ldGhVdGlsLkJOKHBhcmFtcy5laXAxNTU5Lm1heEZlZVBlckdhcylcbiAgICAgIDogbmV3IG9wdGlvbmFsRGVwcy5ldGhVdGlsLkJOKHRoaXMuc2V0R2FzUHJpY2UocGFyYW1zLmdhc1ByaWNlKSk7XG4gICAgY29uc3QgZ2FzTGltaXQgPSBuZXcgb3B0aW9uYWxEZXBzLmV0aFV0aWwuQk4odGhpcy5zZXRHYXNMaW1pdChwYXJhbXMuZ2FzTGltaXQpKTtcblxuICAgIC8vIERlY3J5cHQgcHJpdmF0ZSBrZXlzIGZyb20gS2V5Q2FyZCB2YWx1ZXNcbiAgICBsZXQgdXNlclBydjtcbiAgICBpZiAoIXVzZXJLZXkuc3RhcnRzV2l0aCgneHB1YicpICYmICF1c2VyS2V5LnN0YXJ0c1dpdGgoJ3hwcnYnKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdXNlclBydiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICAgICAgaW5wdXQ6IHVzZXJLZXksXG4gICAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkZWNyeXB0aW5nIHVzZXIga2V5Y2hhaW46ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBiYWNrdXBLZXlBZGRyZXNzO1xuICAgIGxldCBiYWNrdXBTaWduaW5nS2V5O1xuXG4gICAgaWYgKGlzS3JzUmVjb3ZlcnkgfHwgaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICBjb25zdCBiYWNrdXBIRE5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KGJhY2t1cEtleSk7XG4gICAgICBiYWNrdXBTaWduaW5nS2V5ID0gYmFja3VwSEROb2RlLnB1YmxpY0tleTtcbiAgICAgIGJhY2t1cEtleUFkZHJlc3MgPSBgMHgke29wdGlvbmFsRGVwcy5ldGhVdGlsLnB1YmxpY1RvQWRkcmVzcyhiYWNrdXBTaWduaW5nS2V5LCB0cnVlKS50b1N0cmluZygnaGV4Jyl9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGJhY2t1cFBydjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYmFja3VwUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogYmFja3VwS2V5LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZGVjcnlwdGluZyBiYWNrdXAga2V5Y2hhaW46ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYWNrdXBIRE5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KGJhY2t1cFBydik7XG4gICAgICBiYWNrdXBTaWduaW5nS2V5ID0gYmFja3VwSEROb2RlLnByaXZhdGVLZXk7XG4gICAgICBiYWNrdXBLZXlBZGRyZXNzID0gYDB4JHtvcHRpb25hbERlcHMuZXRoVXRpbC5wcml2YXRlVG9BZGRyZXNzKGJhY2t1cFNpZ25pbmdLZXkpLnRvU3RyaW5nKCdoZXgnKX1gO1xuICAgIH1cblxuICAgIC8vIEdldCBub25jZSBmb3IgYmFja3VwIGtleSAoc2hvdWxkIGJlIDApXG4gICAgbGV0IGJhY2t1cEtleU5vbmNlID0gMDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVjb3ZlcnlCbG9ja2NoYWluRXhwbG9yZXJRdWVyeShcbiAgICAgIHtcbiAgICAgICAgY2hhaW5pZDogdGhpcy5nZXRDaGFpbklkKCkudG9TdHJpbmcoKSxcbiAgICAgICAgbW9kdWxlOiAnYWNjb3VudCcsXG4gICAgICAgIGFjdGlvbjogJ3R4bGlzdCcsXG4gICAgICAgIGFkZHJlc3M6IGJhY2t1cEtleUFkZHJlc3MsXG4gICAgICB9LFxuICAgICAgcGFyYW1zLmFwaUtleVxuICAgICk7XG4gICAgY29uc3QgYmFja3VwS2V5VHhMaXN0ID0gcmVzdWx0LnJlc3VsdDtcbiAgICBpZiAoYmFja3VwS2V5VHhMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENhbGN1bGF0ZSBsYXN0IG5vbmNlIHVzZWRcbiAgICAgIGNvbnN0IG91dGdvaW5nVHhzID0gYmFja3VwS2V5VHhMaXN0LmZpbHRlcigodHgpID0+IHR4LmZyb20gPT09IGJhY2t1cEtleUFkZHJlc3MpO1xuICAgICAgYmFja3VwS2V5Tm9uY2UgPSBvdXRnb2luZ1R4cy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGJhbGFuY2Ugb2YgYmFja3VwIGtleSBhbmQgbWFrZSBzdXJlIHdlIGNhbiBhZmZvcmQgZ2FzXG4gICAgY29uc3QgYmFja3VwS2V5QmFsYW5jZSA9IGF3YWl0IHRoaXMucXVlcnlBZGRyZXNzQmFsYW5jZShiYWNrdXBLZXlBZGRyZXNzLCBwYXJhbXMuYXBpS2V5KTtcblxuICAgIGlmIChiYWNrdXBLZXlCYWxhbmNlLmx0KGdhc1ByaWNlLm11bChnYXNMaW1pdCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBCYWNrdXAga2V5IGFkZHJlc3MgJHtiYWNrdXBLZXlBZGRyZXNzfSBoYXMgYmFsYW5jZSAke2JhY2t1cEtleUJhbGFuY2UudG9TdHJpbmcoXG4gICAgICAgICAgMTBcbiAgICAgICAgKX0uIFRoaXMgYWRkcmVzcyBtdXN0IGhhdmUgYSBiYWxhbmNlIG9mIGF0IGxlYXN0IDAuMDEgRVRIIHRvIHBlcmZvcm0gcmVjb3Zlcmllc2BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHRva2VuIGJhbGFuY2Ugb2Ygd2FsbGV0XG4gICAgY29uc3QgdHhBbW91bnQgPSBhd2FpdCB0aGlzLnF1ZXJ5QWRkcmVzc1Rva2VuQmFsYW5jZShcbiAgICAgIHRoaXMudG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICBwYXJhbXMud2FsbGV0Q29udHJhY3RBZGRyZXNzLFxuICAgICAgcGFyYW1zLmFwaUtleVxuICAgICk7XG4gICAgaWYgKG5ldyBCaWdOdW1iZXIodHhBbW91bnQpLmlzTGVzc1RoYW5PckVxdWFsVG8oMCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignV2FsbGV0IGRvZXMgbm90IGhhdmUgZW5vdWdoIGZ1bmRzIHRvIHJlY292ZXInKTtcbiAgICB9XG5cbiAgICAvLyBidWlsZCByZWNpcGllbnRzIG9iamVjdFxuICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICBhbW91bnQ6IHR4QW1vdW50LnRvU3RyaW5nKDEwKSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIC8vIEdldCBzZXF1ZW5jZSBJRCB1c2luZyBjb250cmFjdCBjYWxsXG4gICAgY29uc3Qgc2VxdWVuY2VJZCA9IGF3YWl0IHRoaXMucXVlcnlTZXF1ZW5jZUlkKHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MsIHBhcmFtcy5hcGlLZXkpO1xuXG4gICAgbGV0IG9wZXJhdGlvbkhhc2gsIHNpZ25hdHVyZTtcbiAgICBpZiAoIWlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgLy8gR2V0IG9wZXJhdGlvbiBoYXNoIGFuZCBzaWduIGl0XG4gICAgICBvcGVyYXRpb25IYXNoID0gdGhpcy5nZXRPcGVyYXRpb25TaGEzRm9yRXhlY3V0ZUFuZENvbmZpcm0ocmVjaXBpZW50cywgdGhpcy5nZXREZWZhdWx0RXhwaXJlVGltZSgpLCBzZXF1ZW5jZUlkKTtcbiAgICAgIHNpZ25hdHVyZSA9IFV0aWwuZXRoU2lnbk1zZ0hhc2gob3BlcmF0aW9uSGFzaCwgVXRpbC54cHJ2VG9FdGhQcml2YXRlS2V5KHVzZXJQcnYpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgVXRpbC5lY1JlY292ZXJFdGhBZGRyZXNzKG9wZXJhdGlvbkhhc2gsIHNpZ25hdHVyZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzaWduYXR1cmUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0eEluZm8gPSB7XG4gICAgICByZWNpcGllbnQ6IHJlY2lwaWVudHNbMF0sXG4gICAgICBleHBpcmVUaW1lOiB0aGlzLmdldERlZmF1bHRFeHBpcmVUaW1lKCksXG4gICAgICBjb250cmFjdFNlcXVlbmNlSWQ6IHNlcXVlbmNlSWQsXG4gICAgICBzaWduYXR1cmU6IHNpZ25hdHVyZSxcbiAgICAgIGdhc0xpbWl0OiBnYXNMaW1pdC50b1N0cmluZygxMCksXG4gICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogdGhpcy50b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICB9O1xuXG4gICAgLy8gY2FsY3VsYXRlIHNlbmQgZGF0YVxuICAgIGNvbnN0IHNlbmRNZXRob2RBcmdzID0gdGhpcy5nZXRTZW5kTWV0aG9kQXJncyh0eEluZm8pO1xuICAgIGNvbnN0IG1ldGhvZFNpZ25hdHVyZSA9IG9wdGlvbmFsRGVwcy5ldGhBYmkubWV0aG9kSUQodGhpcy5zZW5kTWV0aG9kTmFtZSwgXy5tYXAoc2VuZE1ldGhvZEFyZ3MsICd0eXBlJykpO1xuICAgIGNvbnN0IGVuY29kZWRBcmdzID0gb3B0aW9uYWxEZXBzLmV0aEFiaS5yYXdFbmNvZGUoXy5tYXAoc2VuZE1ldGhvZEFyZ3MsICd0eXBlJyksIF8ubWFwKHNlbmRNZXRob2RBcmdzLCAndmFsdWUnKSk7XG4gICAgY29uc3Qgc2VuZERhdGEgPSBCdWZmZXIuY29uY2F0KFttZXRob2RTaWduYXR1cmUsIGVuY29kZWRBcmdzXSk7XG5cbiAgICBsZXQgdHggPSBFdGguYnVpbGRUcmFuc2FjdGlvbih7XG4gICAgICB0bzogcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcyxcbiAgICAgIG5vbmNlOiBiYWNrdXBLZXlOb25jZSxcbiAgICAgIHZhbHVlOiAwLFxuICAgICAgZ2FzUHJpY2U6IGdhc1ByaWNlLFxuICAgICAgZ2FzTGltaXQ6IGdhc0xpbWl0LFxuICAgICAgZGF0YTogc2VuZERhdGEsXG4gICAgICBlaXAxNTU5OiBwYXJhbXMuZWlwMTU1OSxcbiAgICAgIHJlcGxheVByb3RlY3Rpb25PcHRpb25zOiBwYXJhbXMucmVwbGF5UHJvdGVjdGlvbk9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRGb3JPZmZsaW5lVmF1bHQoXG4gICAgICAgIHR4SW5mbyxcbiAgICAgICAgdHgsXG4gICAgICAgIHVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleSxcbiAgICAgICAgZ2FzUHJpY2UsXG4gICAgICAgIGdhc0xpbWl0LFxuICAgICAgICBwYXJhbXMuZWlwMTU1OSxcbiAgICAgICAgcGFyYW1zLnJlcGxheVByb3RlY3Rpb25PcHRpb25zLFxuICAgICAgICBwYXJhbXMuYXBpS2V5XG4gICAgICApIGFzIGFueTtcbiAgICB9XG5cbiAgICBpZiAoIWlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgIHR4ID0gdHguc2lnbihiYWNrdXBTaWduaW5nS2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduZWRUeDogUmVjb3ZlcnlJbmZvID0ge1xuICAgICAgaWQ6IG9wdGlvbmFsRGVwcy5ldGhVdGlsLmJ1ZmZlclRvSGV4KHR4Lmhhc2goKSksXG4gICAgICB0eDogdHguc2VyaWFsaXplKCkudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG5cbiAgICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgICAgc2lnbmVkVHguYmFja3VwS2V5ID0gYmFja3VwS2V5O1xuICAgICAgc2lnbmVkVHguY29pbiA9ICdlcmM3MjEnO1xuICAgIH1cblxuICAgIHJldHVybiBzaWduZWRUeDtcbiAgfVxuXG4gIGdldE9wZXJhdGlvbihyZWNpcGllbnQsIGV4cGlyZVRpbWUsIGNvbnRyYWN0U2VxdWVuY2VJZCkge1xuICAgIHJldHVybiBbXG4gICAgICBbJ3N0cmluZycsICdhZGRyZXNzJywgJ3VpbnQnLCAnYWRkcmVzcycsICd1aW50JywgJ3VpbnQnXSxcbiAgICAgIFtcbiAgICAgICAgJ0VSQzcyMScsXG4gICAgICAgIG5ldyBvcHRpb25hbERlcHMuZXRoVXRpbC5CTihvcHRpb25hbERlcHMuZXRoVXRpbC5zdHJpcEhleFByZWZpeChyZWNpcGllbnQuYWRkcmVzcyksIDE2KSxcbiAgICAgICAgcmVjaXBpZW50LmFtb3VudCxcbiAgICAgICAgbmV3IG9wdGlvbmFsRGVwcy5ldGhVdGlsLkJOKG9wdGlvbmFsRGVwcy5ldGhVdGlsLnN0cmlwSGV4UHJlZml4KHRoaXMudG9rZW5Db250cmFjdEFkZHJlc3MpLCAxNiksXG4gICAgICAgIGV4cGlyZVRpbWUsXG4gICAgICAgIGNvbnRyYWN0U2VxdWVuY2VJZCxcbiAgICAgIF0sXG4gICAgXTtcbiAgfVxuXG4gIGdldFNlbmRNZXRob2RBcmdzKHR4SW5mbykge1xuICAgIC8vIE1ldGhvZCBzaWduYXR1cmUgaXNcbiAgICAvLyBzZW5kTXVsdGlTaWdUb2tlbihhZGRyZXNzIHRvQWRkcmVzcywgdWludCB2YWx1ZSwgYWRkcmVzcyB0b2tlbkNvbnRyYWN0QWRkcmVzcywgdWludCBleHBpcmVUaW1lLCB1aW50IHNlcXVlbmNlSWQsIGJ5dGVzIHNpZ25hdHVyZSlcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAndG9BZGRyZXNzJyxcbiAgICAgICAgdHlwZTogJ2FkZHJlc3MnLFxuICAgICAgICB2YWx1ZTogdHhJbmZvLnJlY2lwaWVudC5hZGRyZXNzLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3ZhbHVlJyxcbiAgICAgICAgdHlwZTogJ3VpbnQnLFxuICAgICAgICB2YWx1ZTogdHhJbmZvLnJlY2lwaWVudC5hbW91bnQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAndG9rZW5Db250cmFjdEFkZHJlc3MnLFxuICAgICAgICB0eXBlOiAnYWRkcmVzcycsXG4gICAgICAgIHZhbHVlOiB0aGlzLnRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2V4cGlyZVRpbWUnLFxuICAgICAgICB0eXBlOiAndWludCcsXG4gICAgICAgIHZhbHVlOiB0eEluZm8uZXhwaXJlVGltZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzZXF1ZW5jZUlkJyxcbiAgICAgICAgdHlwZTogJ3VpbnQnLFxuICAgICAgICB2YWx1ZTogdHhJbmZvLmNvbnRyYWN0U2VxdWVuY2VJZCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzaWduYXR1cmUnLFxuICAgICAgICB0eXBlOiAnYnl0ZXMnLFxuICAgICAgICB2YWx1ZTogb3B0aW9uYWxEZXBzLmV0aFV0aWwudG9CdWZmZXIob3B0aW9uYWxEZXBzLmV0aFV0aWwuYWRkSGV4UHJlZml4KHR4SW5mby5zaWduYXR1cmUpKSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHZlcmlmeUNvaW4odHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eFByZWJ1aWxkLmNvaW4gPT09IHRoaXMudG9rZW5Db25maWcuY29pbiAmJiB0eFByZWJ1aWxkLnRva2VuID09PSB0aGlzLnRva2VuQ29uZmlnLnR5cGU7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @prettier
|
|
3
|
+
*/
|
|
4
|
+
import { BitGoBase, CoinConstructor, MPCAlgorithm, NamedCoinConstructor } from '@bitgo-beta/sdk-core';
|
|
5
|
+
import { Erc7984TokenConfig } from '@bitgo-beta/statics';
|
|
6
|
+
import { CoinNames, DecryptionDelegationBuilder, VerifyEthTransactionOptions } from '@bitgo-beta/abstract-eth';
|
|
7
|
+
import { Eth } from './eth';
|
|
8
|
+
import { TransactionBuilder } from './lib';
|
|
9
|
+
export { Erc7984TokenConfig };
|
|
10
|
+
export declare class Erc7984Token extends Eth {
|
|
11
|
+
readonly tokenConfig: Erc7984TokenConfig;
|
|
12
|
+
protected readonly sendMethodName: 'sendMultiSig' | 'sendMultiSigToken';
|
|
13
|
+
static coinNames: CoinNames;
|
|
14
|
+
constructor(bitgo: BitGoBase, tokenConfig: Erc7984TokenConfig);
|
|
15
|
+
static createTokenConstructor(config: Erc7984TokenConfig): CoinConstructor;
|
|
16
|
+
static createTokenConstructors(tokenConfigs?: Erc7984TokenConfig[]): NamedCoinConstructor[];
|
|
17
|
+
get type(): string;
|
|
18
|
+
get name(): string;
|
|
19
|
+
get coin(): string;
|
|
20
|
+
get network(): string;
|
|
21
|
+
get tokenContractAddress(): string;
|
|
22
|
+
get decimalPlaces(): number;
|
|
23
|
+
getChain(): string;
|
|
24
|
+
getFullName(): string;
|
|
25
|
+
getBaseFactor(): number;
|
|
26
|
+
/**
|
|
27
|
+
* Flag for sending value of 0.
|
|
28
|
+
* ERC-7984 confidential transfers always carry an encrypted amount; zero-value sends are not meaningful.
|
|
29
|
+
*/
|
|
30
|
+
valuelessTransferAllowed(): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Flag for sending data along with transactions via the standard token-send API.
|
|
33
|
+
* Returns false because ERC-7984 sends use confidentialTransfer() calldata built
|
|
34
|
+
* by WP, not an arbitrary data field on the send params.
|
|
35
|
+
* Note: this does not prevent calldata-based flows like getDelegationBuilder(),
|
|
36
|
+
* which bypass the token-send path entirely.
|
|
37
|
+
*/
|
|
38
|
+
transactionDataAllowed(): boolean;
|
|
39
|
+
/** @inheritDoc */
|
|
40
|
+
supportsTss(): boolean;
|
|
41
|
+
/** @inheritDoc */
|
|
42
|
+
getMPCAlgorithm(): MPCAlgorithm;
|
|
43
|
+
protected getTransactionBuilder(): TransactionBuilder;
|
|
44
|
+
/** @inheritDoc */
|
|
45
|
+
verifyTransaction(params: VerifyEthTransactionOptions): Promise<boolean>;
|
|
46
|
+
private isConsolidationTransaction;
|
|
47
|
+
private getWalletBaseAddress;
|
|
48
|
+
/**
|
|
49
|
+
* Verifies ERC-7984 forwarder consolidation (flush) transactions.
|
|
50
|
+
*
|
|
51
|
+
* Multisig shape:
|
|
52
|
+
* tx.to = wallet contract
|
|
53
|
+
* tx.data = sendMultiSig(forwarder, 0, callFromParent(token, 0, confidentialTransferNoProof(base, handle)), ...)
|
|
54
|
+
*
|
|
55
|
+
* TSS / direct shape:
|
|
56
|
+
* tx.to = forwarder contract
|
|
57
|
+
* tx.data = callFromParent(token, 0, confidentialTransferNoProof(base, handle))
|
|
58
|
+
*/
|
|
59
|
+
private verifyConfidentialConsolidation;
|
|
60
|
+
/**
|
|
61
|
+
* Verifies a confidential token transfer (SendERC7984) transaction.
|
|
62
|
+
*
|
|
63
|
+
* With txHex — two on-chain shapes are supported:
|
|
64
|
+
*
|
|
65
|
+
* sendMultiSig-wrapped (multisig / smart-contract wallet):
|
|
66
|
+
* tx.to = wallet contract
|
|
67
|
+
* tx.data = sendMultiSig(tokenAddr, 0, confidentialTransfer(recipient, handle, proof), ...)
|
|
68
|
+
* Token contract address is decoded from the sendMultiSig inner calldata.
|
|
69
|
+
*
|
|
70
|
+
* Direct call (hot / TSS EOA wallet):
|
|
71
|
+
* tx.to = token contract
|
|
72
|
+
* tx.data = confidentialTransfer(recipient, handle, proof)
|
|
73
|
+
* Token contract address is taken from tx.to.
|
|
74
|
+
*
|
|
75
|
+
* For both shapes the verifier checks:
|
|
76
|
+
* 1. Token contract address matches this coin's tokenContractAddress.
|
|
77
|
+
* 2. Decoded recipient matches txParams.recipients[0].address or buildParams.recipients[0].address.
|
|
78
|
+
* 3. encryptedHandle and inputProof are structurally present (non-empty).
|
|
79
|
+
* 4. txParams.recipients[0].amount is a positive integer and matches buildParams when both present.
|
|
80
|
+
*
|
|
81
|
+
* Without txHex (first-signer / pre-signing path):
|
|
82
|
+
* 1. Requires exactly one recipient in txParams.
|
|
83
|
+
* 2. Validates txParams.recipients[0].address is a valid Ethereum address.
|
|
84
|
+
* 3. Validates txParams.recipients[0].amount is a positive integer.
|
|
85
|
+
* 4. Cross-checks address and amount against buildParams when the server has stored the intent.
|
|
86
|
+
*/
|
|
87
|
+
private verifyConfidentialTransfer;
|
|
88
|
+
private static isPositiveIntegerString;
|
|
89
|
+
/**
|
|
90
|
+
* Verifies a token enablement transaction for ERC-7984 decryption delegation.
|
|
91
|
+
*
|
|
92
|
+
* TSS path: decodes the raw tx and verifies it calls the ACL contract with
|
|
93
|
+
* calldata that covers all requested token contract addresses.
|
|
94
|
+
*
|
|
95
|
+
* Multisig path: verifies the buildParams recipients carry the correct tokenNames
|
|
96
|
+
* and zero amounts.
|
|
97
|
+
*/
|
|
98
|
+
private verifyEnableTokenTransaction;
|
|
99
|
+
/**
|
|
100
|
+
* Returns a DecryptionDelegationBuilder for constructing Zama ACL decryption
|
|
101
|
+
* delegation transactions.
|
|
102
|
+
*
|
|
103
|
+
* The builder produces a DecryptionDelegationTxRequest {to, data, value} that is
|
|
104
|
+
* wallet-type-agnostic — WP routes it to the correct signing path:
|
|
105
|
+
* - MPC: submit as a raw TSS transaction
|
|
106
|
+
* - Multisig: wrap in sendMultiSig(walletContract, to, 0, data, ...)
|
|
107
|
+
*
|
|
108
|
+
* Example:
|
|
109
|
+
* const req = coin.getDecryptionDelegationBuilder().build({
|
|
110
|
+
* aclContractAddress: '0xf0Ff...',
|
|
111
|
+
* delegateAddress: enterpriseViewingKey,
|
|
112
|
+
* tokenContractAddresses: [tokenAddress],
|
|
113
|
+
* expiryTimestamp: Math.floor(Date.now() / 1000) + 365 * 86400,
|
|
114
|
+
* });
|
|
115
|
+
*/
|
|
116
|
+
getDecryptionDelegationBuilder(): DecryptionDelegationBuilder;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=erc7984Token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erc7984Token.d.ts","sourceRoot":"","sources":["../../src/erc7984Token.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEtG,OAAO,EAAS,kBAAkB,EAA2B,MAAM,qBAAqB,CAAC;AACzF,OAAO,EACL,SAAS,EACT,2BAA2B,EAQ3B,2BAA2B,EAG5B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,qBAAa,YAAa,SAAQ,GAAG;IACnC,SAAgB,WAAW,EAAE,kBAAkB,CAAC;IAChD,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,cAAc,GAAG,mBAAmB,CAAC;IACxE,MAAM,CAAC,SAAS,EAAE,SAAS,CAGzB;gBAEU,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB;IAU7D,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,eAAe;IAI1E,MAAM,CAAC,uBAAuB,CAC5B,YAAY,GAAE,kBAAkB,EAG/B,GACA,oBAAoB,EAAE;IAUzB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,oBAAoB,IAAI,MAAM,CAEjC;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,QAAQ,IAAI,MAAM;IAIlB,WAAW,IAAI,MAAM;IAIrB,aAAa,IAAI,MAAM;IAIvB;;;OAGG;IACH,wBAAwB,IAAI,OAAO;IAInC;;;;;;OAMG;IACH,sBAAsB,IAAI,OAAO;IAIjC,kBAAkB;IAClB,WAAW,IAAI,OAAO;IAItB,kBAAkB;IAClB,eAAe,IAAI,YAAY;IAI/B,SAAS,CAAC,qBAAqB,IAAI,kBAAkB;IAIrD,kBAAkB;IACZ,iBAAiB,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,OAAO,CAAC;IAU9E,OAAO,CAAC,0BAA0B;IAclC,OAAO,CAAC,oBAAoB;IAS5B;;;;;;;;;;OAUG;YACW,+BAA+B;IA+E7C;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;YACW,0BAA0B;IAuIxC,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAItC;;;;;;;;OAQG;YACW,4BAA4B;IAqH1C;;;;;;;;;;;;;;;;OAgBG;IACH,8BAA8B,IAAI,2BAA2B;CAG9D"}
|