Skip to content

Commit d9569d8

Browse files
committed
feat(sdk-coin-ton): add util function to derive vesting contract address
Ticket: WIN-7890
1 parent 1e45a0d commit d9569d8

File tree

4 files changed

+58
-2
lines changed

4 files changed

+58
-2
lines changed

modules/sdk-coin-ton/src/lib/constants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@ export const VESTING_CONTRACT_WALLET_ID = 268;
22
export const WALLET_ID = 698983191;
33
export const JETTON_TRANSFER_OPCODE = 0x0f8a7ea5;
44
export const WITHDRAW_OPCODE = '00001000';
5+
export const VESTING_CONTRACT_CODE_B64 =
6+
'te6cckECHAEAA/sAART/APSkE/S88sgLAQIBIAISAgFIAwUDrNBsIiDXScFgkVvgAdDTAwFxsJFb4PpAMNs8AdMf0z/4S1JAxwUjghCnczrNurCOpGwS2zyCEPdzOs0BcIAYyMsFUATPFiP6AhPLassfyz/JgED7AOMOExQEAc74SlJAxwUDghByWKabuhOwjtGOLAH6QH/IygAC+kQByMoHy//J0PhEECOBAQj0QfhkINdKwgAglQHUMNAB3rMS5oIQ8limmzJwgBjIywVQBM8WI/oCE8tqyx/LP8mAQPsA2zySXwPiGwIBIAYPAgEgBwoCAW4ICQAZrc52omhAIGuQ64X/wAAZrx32omhAEGuQ64WPwAIBYgsMAUutNG2eNvwiRw1AgIR6STfSmRDOaQPp/5g3gSgBt4EBSJhxWfMYQBMCAWoNDgAPol+1E0NcLH4BL6LHbPPpEAcjKB8v/ydD4RIEBCPQKb6ExhMCASAQEQEpukYts8+EX4RvhH+Ej4SfhK+Ev4RIEwINuYRts82zyBMVA7jygwjXGCDTH9Mf0x8C+CO78mTtRNDTH9Mf0/8wWrryoVAzuvKiAvkBQDP5EPKj+ADbPCDXSsABjpntRO1F7UeRW+1n7WXtZI6C2zztQe3xAfL/kTDi+EGk+GHbPBMUGwB+7UTQ0x8B+GHTHwH4YtP/Afhj9AQB+GTUAdDTPwH4ZdMfAfhm0x8B+GfTHwH4aPoAAfhp+kAB+Gr6QAH4a9HRAlzTB9TR+CPbPCDCAI6bIsAD8uBkIdDTA/pAMfpA+EpSIMcFs5JfBOMNkTDiAfsAFRYAYPhF+EagUhC8kjBw4PhF+EigUhC5kzD4SeD4SfhJ+EUTofhHqQT4RvhHqQQQI6mEoQP6IfpEAcjKB8v/ydD4RIEBCPQKb6Exj18zAXKwwALy4GUB+gAxcdch+gAx+gAx0z8x0x8x0wABwADy4GbTAAGT1DDQ3iFx2zyOKjHTHzAgghBOc3RLuiGCEEdldCS6sSGCEFZ0Q3C6sQGCEFZvdGW6sfLgZ+MOcJJfA+IgwgAYFxoC6gFw2zyObSDXScIAjmPTHyHAACKDC7qxIoEQAbqxIoIQR9VDkbqxIoIQWV8HvLqxIoIQafswbLqxIoIQVm90ZbqxIoIQVnRDcLqx8uBnAcAAIddJwgCwjhXTBzAgwGQhwHexIcBEsQHAV7Hy4GiRMOKRMOLjDRgZAEQB+kQBw/+SW3DgAfgzIG6SW3Dg0CDXSYMHuZJbcODXC/+6ABrTHzCCEFZvdGW68uBnAA6TcvsCkTDiAGb4SPhH+Eb4RcjLP8sfyx/LH/hJ+gL4Ss8W+EvPFsn4RPhD+EL4QcjLH8sfy//0AMzJ7VSo1+S9';

modules/sdk-coin-ton/src/lib/iface.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,15 @@ export interface TxData {
2020
}
2121

2222
export type TransactionExplanation = ITransactionExplanation<TransactionFee>;
23+
24+
export type VestingContractParams = {
25+
subWalletId: number;
26+
publicKeyHex: string;
27+
vestingStartTime: number;
28+
vestingTotalDuration: number;
29+
unlockPeriod: number;
30+
cliffDuration: number;
31+
vestingTotalAmount: bigint;
32+
vestingSenderAddress: string;
33+
ownerAddress: string;
34+
};

modules/sdk-coin-ton/src/lib/utils.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import { BaseUtils, isValidEd25519PublicKey } from '@bitgo/sdk-core';
21
import TonWeb from 'tonweb';
3-
2+
import { BN } from 'bn.js';
3+
import { BaseUtils, isValidEd25519PublicKey } from '@bitgo/sdk-core';
4+
import { VESTING_CONTRACT_CODE_B64 } from './constants';
5+
import { VestingContractParams } from './iface';
46
export class Utils implements BaseUtils {
57
/** @inheritdoc */
68
isValidAddress(address: string): boolean {
@@ -85,6 +87,30 @@ export class Utils implements BaseUtils {
8587
const address = slice.loadAddress();
8688
return address.toString();
8789
}
90+
91+
async getVestingContractAddress(params: VestingContractParams): Promise<string> {
92+
const cell = new TonWeb.boc.Cell();
93+
cell.bits.writeUint(0, 32); //seq no
94+
cell.bits.writeUint(params.subWalletId, 32);
95+
cell.bits.writeBytes(TonWeb.utils.hexToBytes(params.publicKeyHex));
96+
cell.bits.writeUint(0, 1); // empty whitelist
97+
const vestingParamsCell = new TonWeb.boc.Cell();
98+
vestingParamsCell.bits.writeUint(params.vestingStartTime, 64);
99+
vestingParamsCell.bits.writeUint(params.vestingTotalDuration, 32);
100+
vestingParamsCell.bits.writeUint(params.unlockPeriod, 32);
101+
vestingParamsCell.bits.writeUint(params.cliffDuration, 32);
102+
vestingParamsCell.bits.writeCoins(new BN(params.vestingTotalAmount.toString()));
103+
const senderAddress = new TonWeb.Address(params.vestingSenderAddress);
104+
vestingParamsCell.bits.writeAddress(senderAddress);
105+
const ownerAddress = new TonWeb.Address(params.ownerAddress);
106+
vestingParamsCell.bits.writeAddress(ownerAddress);
107+
cell.refs.push(vestingParamsCell);
108+
const contractCodeCell = TonWeb.boc.Cell.oneFromBoc(TonWeb.utils.base64ToBytes(VESTING_CONTRACT_CODE_B64));
109+
const stateInit = TonWeb.Contract.createStateInit(contractCodeCell, cell);
110+
const stateInitHash = await stateInit.hash();
111+
const contractAddress = new TonWeb.Address('0:' + TonWeb.utils.bytesToHex(stateInitHash));
112+
return contractAddress.toString(true, true, true);
113+
}
88114
}
89115

90116
const DUMMY_PRIVATE_KEY = '43e8594854cb53947c4a1a2fab926af11e123f6251dcd5bd0dfb100604186430'; // This dummy private key is used only for fee estimation

modules/sdk-coin-ton/test/unit/ton.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,22 @@ describe('TON:', function () {
532532
'0:d57b25093b1dc09d91962ed13497e571bfb73bb939c3f0e5ed08585a3be9ef6a'
533533
);
534534
});
535+
536+
it('should get valid vesting contract address', async function () {
537+
const vestingParams = {
538+
subWalletId: 698983191,
539+
publicKeyHex: '71013394862995cfb527dea9cadcc84d66d1197d2a4454579b93a08223e4b309',
540+
vestingStartTime: 1760999164,
541+
vestingTotalDuration: 60 * 60 * 24 * 30,
542+
unlockPeriod: 60 * 60 * 24,
543+
cliffDuration: 60 * 60,
544+
vestingTotalAmount: BigInt('400000000'),
545+
vestingSenderAddress: '0QDOEyzC6KXiVh2Rco2bapH96Vn6lb9YWxgkTVWtq-9CXFtp',
546+
ownerAddress: '0QDBrOgjQThbN7eWBHErRhrJQH3ApecGDtu3K11Lujjmx49Z',
547+
};
548+
const vestingContractAddress = await utils.getVestingContractAddress(vestingParams);
549+
vestingContractAddress.should.equal('EQAjmgMbwU3WVK_pn2gj1XBG_NMvrkoT4earvs_C9Q6fs-SE');
550+
});
535551
});
536552

537553
describe('getAddress', function () {

0 commit comments

Comments
 (0)