Flesh out @solana/spl-token with token2 instructions (#410)
* Fix token-js docs * Add Freeze/Thaw instructions * Add v2 instructions * Add new instructions to js test * Bump @solana/spl-token to v0.0.8 * Fix didThrow and remove invalidApprove
This commit is contained in:
parent
708bb430ab
commit
7141298b2f
|
@ -9,13 +9,16 @@ import {
|
||||||
createMint,
|
createMint,
|
||||||
createAccount,
|
createAccount,
|
||||||
transfer,
|
transfer,
|
||||||
|
transfer2,
|
||||||
approveRevoke,
|
approveRevoke,
|
||||||
invalidApprove,
|
|
||||||
failOnApproveOverspend,
|
failOnApproveOverspend,
|
||||||
setAuthority,
|
setAuthority,
|
||||||
mintTo,
|
mintTo,
|
||||||
|
mintTo2,
|
||||||
multisig,
|
multisig,
|
||||||
burn,
|
burn,
|
||||||
|
burn2,
|
||||||
|
freezeThawAccount,
|
||||||
closeAccount,
|
closeAccount,
|
||||||
nativeToken,
|
nativeToken,
|
||||||
} from './token-test';
|
} from './token-test';
|
||||||
|
@ -29,18 +32,24 @@ async function main() {
|
||||||
await createAccount();
|
await createAccount();
|
||||||
console.log('Run test: mintTo');
|
console.log('Run test: mintTo');
|
||||||
await mintTo();
|
await mintTo();
|
||||||
|
console.log('Run test: mintTo2');
|
||||||
|
await mintTo2();
|
||||||
console.log('Run test: transfer');
|
console.log('Run test: transfer');
|
||||||
await transfer();
|
await transfer();
|
||||||
|
console.log('Run test: transfer2');
|
||||||
|
await transfer2();
|
||||||
console.log('Run test: approveRevoke');
|
console.log('Run test: approveRevoke');
|
||||||
await approveRevoke();
|
await approveRevoke();
|
||||||
console.log('Run test: invalidApprove');
|
|
||||||
await invalidApprove();
|
|
||||||
console.log('Run test: failOnApproveOverspend');
|
console.log('Run test: failOnApproveOverspend');
|
||||||
await failOnApproveOverspend();
|
await failOnApproveOverspend();
|
||||||
console.log('Run test: setAuthority');
|
console.log('Run test: setAuthority');
|
||||||
await setAuthority();
|
await setAuthority();
|
||||||
console.log('Run test: burn');
|
console.log('Run test: burn');
|
||||||
await burn();
|
await burn();
|
||||||
|
console.log('Run test: burn2');
|
||||||
|
await burn2();
|
||||||
|
console.log('Run test: freezeThawAccount');
|
||||||
|
await freezeThawAccount();
|
||||||
console.log('Run test: closeAccount');
|
console.log('Run test: closeAccount');
|
||||||
await closeAccount();
|
await closeAccount();
|
||||||
console.log('Run test: multisig');
|
console.log('Run test: multisig');
|
||||||
|
|
|
@ -28,9 +28,9 @@ function assert(condition, message) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function didThrow(func, args): Promise<boolean> {
|
async function didThrow(obj, func, args): Promise<boolean> {
|
||||||
try {
|
try {
|
||||||
await func.apply(args);
|
await func.apply(testToken, args);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -125,7 +125,7 @@ export async function createMint(): Promise<void> {
|
||||||
connection,
|
connection,
|
||||||
payer,
|
payer,
|
||||||
testMintAuthority.publicKey,
|
testMintAuthority.publicKey,
|
||||||
null,
|
testMintAuthority.publicKey,
|
||||||
2,
|
2,
|
||||||
programId,
|
programId,
|
||||||
);
|
);
|
||||||
|
@ -139,7 +139,11 @@ export async function createMint(): Promise<void> {
|
||||||
assert(mintInfo.supply.toNumber() === 0);
|
assert(mintInfo.supply.toNumber() === 0);
|
||||||
assert(mintInfo.decimals === 2);
|
assert(mintInfo.decimals === 2);
|
||||||
assert(mintInfo.isInitialized === true);
|
assert(mintInfo.isInitialized === true);
|
||||||
assert(mintInfo.freezeAuthority === null);
|
if (mintInfo.freezeAuthority !== null) {
|
||||||
|
assert(mintInfo.freezeAuthority.equals(testMintAuthority.publicKey));
|
||||||
|
} else {
|
||||||
|
assert(mintInfo.freezeAuthority !== null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function createAccount(): Promise<void> {
|
export async function createAccount(): Promise<void> {
|
||||||
|
@ -168,6 +172,26 @@ export async function mintTo(): Promise<void> {
|
||||||
assert(accountInfo.amount.toNumber() === 1000);
|
assert(accountInfo.amount.toNumber() === 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function mintTo2(): Promise<void> {
|
||||||
|
assert(
|
||||||
|
await didThrow(testToken, testToken.mintTo2, [
|
||||||
|
testAccount,
|
||||||
|
testMintAuthority,
|
||||||
|
[],
|
||||||
|
1000,
|
||||||
|
1,
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
|
||||||
|
await testToken.mintTo2(testAccount, testMintAuthority, [], 1000, 2);
|
||||||
|
|
||||||
|
const mintInfo = await testToken.getMintInfo();
|
||||||
|
assert(mintInfo.supply.toNumber() === 2000);
|
||||||
|
|
||||||
|
const accountInfo = await testToken.getAccountInfo(testAccount);
|
||||||
|
assert(accountInfo.amount.toNumber() === 2000);
|
||||||
|
}
|
||||||
|
|
||||||
export async function transfer(): Promise<void> {
|
export async function transfer(): Promise<void> {
|
||||||
const destOwner = new Account();
|
const destOwner = new Account();
|
||||||
const dest = await testToken.createAccount(destOwner.publicKey);
|
const dest = await testToken.createAccount(destOwner.publicKey);
|
||||||
|
@ -175,13 +199,40 @@ export async function transfer(): Promise<void> {
|
||||||
await testToken.transfer(testAccount, dest, testAccountOwner, [], 100);
|
await testToken.transfer(testAccount, dest, testAccountOwner, [], 100);
|
||||||
|
|
||||||
const mintInfo = await testToken.getMintInfo();
|
const mintInfo = await testToken.getMintInfo();
|
||||||
assert(mintInfo.supply.toNumber() === 1000);
|
assert(mintInfo.supply.toNumber() === 2000);
|
||||||
|
|
||||||
let destAccountInfo = await testToken.getAccountInfo(dest);
|
let destAccountInfo = await testToken.getAccountInfo(dest);
|
||||||
assert(destAccountInfo.amount.toNumber() === 100);
|
assert(destAccountInfo.amount.toNumber() === 100);
|
||||||
|
|
||||||
let testAccountInfo = await testToken.getAccountInfo(testAccount);
|
let testAccountInfo = await testToken.getAccountInfo(testAccount);
|
||||||
assert(testAccountInfo.amount.toNumber() === 900);
|
assert(testAccountInfo.amount.toNumber() === 1900);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function transfer2(): Promise<void> {
|
||||||
|
const destOwner = new Account();
|
||||||
|
const dest = await testToken.createAccount(destOwner.publicKey);
|
||||||
|
|
||||||
|
assert(
|
||||||
|
await didThrow(testToken, testToken.transfer2, [
|
||||||
|
testAccount,
|
||||||
|
dest,
|
||||||
|
testAccountOwner,
|
||||||
|
[],
|
||||||
|
100,
|
||||||
|
1,
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
|
||||||
|
await testToken.transfer2(testAccount, dest, testAccountOwner, [], 100, 2);
|
||||||
|
|
||||||
|
const mintInfo = await testToken.getMintInfo();
|
||||||
|
assert(mintInfo.supply.toNumber() === 2000);
|
||||||
|
|
||||||
|
let destAccountInfo = await testToken.getAccountInfo(dest);
|
||||||
|
assert(destAccountInfo.amount.toNumber() === 100);
|
||||||
|
|
||||||
|
let testAccountInfo = await testToken.getAccountInfo(testAccount);
|
||||||
|
assert(testAccountInfo.amount.toNumber() === 1800);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function approveRevoke(): Promise<void> {
|
export async function approveRevoke(): Promise<void> {
|
||||||
|
@ -206,18 +257,6 @@ export async function approveRevoke(): Promise<void> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function invalidApprove(): Promise<void> {
|
|
||||||
const owner = new Account();
|
|
||||||
const account1 = await testToken.createAccount(owner.publicKey);
|
|
||||||
const account2 = await testToken.createAccount(owner.publicKey);
|
|
||||||
const delegate = new Account();
|
|
||||||
|
|
||||||
// account2 is not a delegate account of account1
|
|
||||||
assert(didThrow(testToken.approve, [account1, account2, owner, [], 123]));
|
|
||||||
// account1Delegate is not a delegate account of account2
|
|
||||||
assert(didThrow(testToken.approve, [account2, delegate, owner, [], 123]));
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function failOnApproveOverspend(): Promise<void> {
|
export async function failOnApproveOverspend(): Promise<void> {
|
||||||
const owner = new Account();
|
const owner = new Account();
|
||||||
const account1 = await testToken.createAccount(owner.publicKey);
|
const account1 = await testToken.createAccount(owner.publicKey);
|
||||||
|
@ -232,7 +271,7 @@ export async function failOnApproveOverspend(): Promise<void> {
|
||||||
assert(account1Info.amount.toNumber() == 10);
|
assert(account1Info.amount.toNumber() == 10);
|
||||||
assert(account1Info.delegatedAmount.toNumber() == 2);
|
assert(account1Info.delegatedAmount.toNumber() == 2);
|
||||||
if (account1Info.delegate === null) {
|
if (account1Info.delegate === null) {
|
||||||
throw new Error('deleage should not be null');
|
throw new Error('delegate should not be null');
|
||||||
} else {
|
} else {
|
||||||
assert(account1Info.delegate.equals(delegate.publicKey));
|
assert(account1Info.delegate.equals(delegate.publicKey));
|
||||||
}
|
}
|
||||||
|
@ -250,7 +289,15 @@ export async function failOnApproveOverspend(): Promise<void> {
|
||||||
assert(account1Info.delegate === null);
|
assert(account1Info.delegate === null);
|
||||||
assert(account1Info.delegatedAmount.toNumber() == 0);
|
assert(account1Info.delegatedAmount.toNumber() == 0);
|
||||||
|
|
||||||
assert(didThrow(testToken.transfer, [account1, account2, delegate, [], 1]));
|
assert(
|
||||||
|
await didThrow(testToken, testToken.transfer, [
|
||||||
|
account1,
|
||||||
|
account2,
|
||||||
|
delegate,
|
||||||
|
[],
|
||||||
|
1,
|
||||||
|
]),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function setAuthority(): Promise<void> {
|
export async function setAuthority(): Promise<void> {
|
||||||
|
@ -263,8 +310,8 @@ export async function setAuthority(): Promise<void> {
|
||||||
[],
|
[],
|
||||||
);
|
);
|
||||||
assert(
|
assert(
|
||||||
didThrow(testToken.setAuthority, [
|
await didThrow(testToken, testToken.setAuthority, [
|
||||||
testAccountOwner,
|
testAccount,
|
||||||
newOwner.publicKey,
|
newOwner.publicKey,
|
||||||
'AccountOwner',
|
'AccountOwner',
|
||||||
testAccountOwner,
|
testAccountOwner,
|
||||||
|
@ -290,6 +337,53 @@ export async function burn(): Promise<void> {
|
||||||
assert(accountInfo.amount.toNumber() == amount - 1);
|
assert(accountInfo.amount.toNumber() == amount - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function burn2(): Promise<void> {
|
||||||
|
let accountInfo = await testToken.getAccountInfo(testAccount);
|
||||||
|
const amount = accountInfo.amount.toNumber();
|
||||||
|
|
||||||
|
assert(
|
||||||
|
await didThrow(testToken, testToken.burn2, [
|
||||||
|
testAccount,
|
||||||
|
testAccountOwner,
|
||||||
|
[],
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
|
||||||
|
await testToken.burn2(testAccount, testAccountOwner, [], 1, 2);
|
||||||
|
|
||||||
|
accountInfo = await testToken.getAccountInfo(testAccount);
|
||||||
|
assert(accountInfo.amount.toNumber() == amount - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function freezeThawAccount(): Promise<void> {
|
||||||
|
let accountInfo = await testToken.getAccountInfo(testAccount);
|
||||||
|
const amount = accountInfo.amount.toNumber();
|
||||||
|
|
||||||
|
await testToken.freezeAccount(testAccount, testMintAuthority, []);
|
||||||
|
|
||||||
|
const destOwner = new Account();
|
||||||
|
const dest = await testToken.createAccount(destOwner.publicKey);
|
||||||
|
|
||||||
|
assert(
|
||||||
|
await didThrow(testToken, testToken.transfer, [
|
||||||
|
testAccount,
|
||||||
|
dest,
|
||||||
|
testAccountOwner,
|
||||||
|
[],
|
||||||
|
100,
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
|
||||||
|
await testToken.thawAccount(testAccount, testMintAuthority, []);
|
||||||
|
|
||||||
|
await testToken.transfer(testAccount, dest, testAccountOwner, [], 100);
|
||||||
|
|
||||||
|
let testAccountInfo = await testToken.getAccountInfo(testAccount);
|
||||||
|
assert(testAccountInfo.amount.toNumber() === amount - 100);
|
||||||
|
}
|
||||||
|
|
||||||
export async function closeAccount(): Promise<void> {
|
export async function closeAccount(): Promise<void> {
|
||||||
const closeAuthority = new Account();
|
const closeAuthority = new Account();
|
||||||
|
|
||||||
|
@ -312,7 +406,12 @@ export async function closeAccount(): Promise<void> {
|
||||||
|
|
||||||
// Check that accounts with non-zero token balance cannot be closed
|
// Check that accounts with non-zero token balance cannot be closed
|
||||||
assert(
|
assert(
|
||||||
didThrow(testToken.closeAccount, [testAccount, dest, closeAuthority, []]),
|
await didThrow(testToken, testToken.closeAccount, [
|
||||||
|
testAccount,
|
||||||
|
dest,
|
||||||
|
closeAuthority,
|
||||||
|
[],
|
||||||
|
]),
|
||||||
);
|
);
|
||||||
|
|
||||||
const connection = await getConnection();
|
const connection = await getConnection();
|
||||||
|
|
|
@ -324,12 +324,12 @@ export class Token {
|
||||||
* Creates and initializes a token.
|
* Creates and initializes a token.
|
||||||
*
|
*
|
||||||
* @param connection The connection to use
|
* @param connection The connection to use
|
||||||
* @param owner User account that will own the returned account
|
* @param payer Fee payer for transaction
|
||||||
* @param supply Initial supply to mint
|
* @param mintAuthority Account or multisig that will control minting
|
||||||
|
* @param freezeAuthority Optional account or multisig that can freeze token accounts
|
||||||
* @param decimals Location of the decimal place
|
* @param decimals Location of the decimal place
|
||||||
* @param programId Optional token programId, uses the system programId by default
|
* @param programId Optional token programId, uses the system programId by default
|
||||||
* @return Token object for the newly minted token, Public key of the account
|
* @return Token object for the newly minted token
|
||||||
* holding the total amount of new tokens
|
|
||||||
*/
|
*/
|
||||||
static async createMint(
|
static async createMint(
|
||||||
connection: Connection,
|
connection: Connection,
|
||||||
|
@ -432,6 +432,8 @@ export class Token {
|
||||||
*
|
*
|
||||||
* This account may then be used for multisignature verification
|
* This account may then be used for multisignature verification
|
||||||
*
|
*
|
||||||
|
* @param m Number of required signatures
|
||||||
|
* @param signers Full set of signers
|
||||||
* @return Public key of the new multisig account
|
* @return Public key of the new multisig account
|
||||||
*/
|
*/
|
||||||
async createMultisig(
|
async createMultisig(
|
||||||
|
@ -623,24 +625,24 @@ export class Token {
|
||||||
*
|
*
|
||||||
* @param source Source account
|
* @param source Source account
|
||||||
* @param destination Destination account
|
* @param destination Destination account
|
||||||
* @param authority Owner of the source account
|
* @param owner Owner of the source account
|
||||||
* @param multiSigners Signing accounts if `authority` is a multiSig
|
* @param multiSigners Signing accounts if `owner` is a multiSig
|
||||||
* @param amount Number of tokens to transfer
|
* @param amount Number of tokens to transfer
|
||||||
*/
|
*/
|
||||||
async transfer(
|
async transfer(
|
||||||
source: PublicKey,
|
source: PublicKey,
|
||||||
destination: PublicKey,
|
destination: PublicKey,
|
||||||
authority: any,
|
owner: any,
|
||||||
multiSigners: Array<Account>,
|
multiSigners: Array<Account>,
|
||||||
amount: number | u64,
|
amount: number | u64,
|
||||||
): Promise<TransactionSignature> {
|
): Promise<TransactionSignature> {
|
||||||
let ownerPublicKey;
|
let ownerPublicKey;
|
||||||
let signers;
|
let signers;
|
||||||
if (isAccount(authority)) {
|
if (isAccount(owner)) {
|
||||||
ownerPublicKey = authority.publicKey;
|
ownerPublicKey = owner.publicKey;
|
||||||
signers = [authority];
|
signers = [owner];
|
||||||
} else {
|
} else {
|
||||||
ownerPublicKey = authority;
|
ownerPublicKey = owner;
|
||||||
signers = multiSigners;
|
signers = multiSigners;
|
||||||
}
|
}
|
||||||
return await sendAndConfirmTransaction(
|
return await sendAndConfirmTransaction(
|
||||||
|
@ -788,9 +790,9 @@ export class Token {
|
||||||
* Mint new tokens
|
* Mint new tokens
|
||||||
*
|
*
|
||||||
* @param dest Public key of the account to mint to
|
* @param dest Public key of the account to mint to
|
||||||
* @param authority Owner of the mint
|
* @param authority Minting authority
|
||||||
* @param multiSigners Signing accounts if `authority` is a multiSig
|
* @param multiSigners Signing accounts if `authority` is a multiSig
|
||||||
* @param amount ammount to mint
|
* @param amount Amount to mint
|
||||||
*/
|
*/
|
||||||
async mintTo(
|
async mintTo(
|
||||||
dest: PublicKey,
|
dest: PublicKey,
|
||||||
|
@ -829,9 +831,9 @@ export class Token {
|
||||||
* Burn tokens
|
* Burn tokens
|
||||||
*
|
*
|
||||||
* @param account Account to burn tokens from
|
* @param account Account to burn tokens from
|
||||||
* @param owner Public key account owner
|
* @param owner Account owner
|
||||||
* @param multiSigners Signing accounts if `authority` is a multiSig
|
* @param multiSigners Signing accounts if `owner` is a multiSig
|
||||||
* @param amount amount to burn
|
* @param amount Amount to burn
|
||||||
*/
|
*/
|
||||||
async burn(
|
async burn(
|
||||||
account: PublicKey,
|
account: PublicKey,
|
||||||
|
@ -871,8 +873,8 @@ export class Token {
|
||||||
*
|
*
|
||||||
* @param account Account to close
|
* @param account Account to close
|
||||||
* @param dest Account to receive the remaining balance of the closed account
|
* @param dest Account to receive the remaining balance of the closed account
|
||||||
* @param authority Account which is allowed to close the account
|
* @param authority Authority which is allowed to close the account
|
||||||
* @param multiSigners Signing accounts if `owner` is a multiSig
|
* @param multiSigners Signing accounts if `authority` is a multiSig
|
||||||
*/
|
*/
|
||||||
async closeAccount(
|
async closeAccount(
|
||||||
account: PublicKey,
|
account: PublicKey,
|
||||||
|
@ -906,13 +908,273 @@ export class Token {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Freeze account
|
||||||
|
*
|
||||||
|
* @param account Account to freeze
|
||||||
|
* @param authority The mint freeze authority
|
||||||
|
* @param multiSigners Signing accounts if `authority` is a multiSig
|
||||||
|
*/
|
||||||
|
async freezeAccount(
|
||||||
|
account: PublicKey,
|
||||||
|
authority: any,
|
||||||
|
multiSigners: Array<Account>,
|
||||||
|
): Promise<void> {
|
||||||
|
let authorityPublicKey;
|
||||||
|
let signers;
|
||||||
|
if (isAccount(authority)) {
|
||||||
|
authorityPublicKey = authority.publicKey;
|
||||||
|
signers = [authority];
|
||||||
|
} else {
|
||||||
|
authorityPublicKey = authority;
|
||||||
|
signers = multiSigners;
|
||||||
|
}
|
||||||
|
await sendAndConfirmTransaction(
|
||||||
|
'FreezeAccount',
|
||||||
|
this.connection,
|
||||||
|
new Transaction().add(
|
||||||
|
Token.createFreezeAccountInstruction(
|
||||||
|
this.programId,
|
||||||
|
account,
|
||||||
|
this.publicKey,
|
||||||
|
authorityPublicKey,
|
||||||
|
multiSigners,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
this.payer,
|
||||||
|
...signers,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thaw account
|
||||||
|
*
|
||||||
|
* @param account Account to thaw
|
||||||
|
* @param authority The mint freeze authority
|
||||||
|
* @param multiSigners Signing accounts if `authority` is a multiSig
|
||||||
|
*/
|
||||||
|
async thawAccount(
|
||||||
|
account: PublicKey,
|
||||||
|
authority: any,
|
||||||
|
multiSigners: Array<Account>,
|
||||||
|
): Promise<void> {
|
||||||
|
let authorityPublicKey;
|
||||||
|
let signers;
|
||||||
|
if (isAccount(authority)) {
|
||||||
|
authorityPublicKey = authority.publicKey;
|
||||||
|
signers = [authority];
|
||||||
|
} else {
|
||||||
|
authorityPublicKey = authority;
|
||||||
|
signers = multiSigners;
|
||||||
|
}
|
||||||
|
await sendAndConfirmTransaction(
|
||||||
|
'ThawAccount',
|
||||||
|
this.connection,
|
||||||
|
new Transaction().add(
|
||||||
|
Token.createThawAccountInstruction(
|
||||||
|
this.programId,
|
||||||
|
account,
|
||||||
|
this.publicKey,
|
||||||
|
authorityPublicKey,
|
||||||
|
multiSigners,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
this.payer,
|
||||||
|
...signers,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transfer tokens to another account, asserting the token mint and decimals
|
||||||
|
*
|
||||||
|
* @param source Source account
|
||||||
|
* @param destination Destination account
|
||||||
|
* @param owner Owner of the source account
|
||||||
|
* @param multiSigners Signing accounts if `owner` is a multiSig
|
||||||
|
* @param amount Number of tokens to transfer
|
||||||
|
* @param decimals Number of decimals in transfer amount
|
||||||
|
*/
|
||||||
|
async transfer2(
|
||||||
|
source: PublicKey,
|
||||||
|
destination: PublicKey,
|
||||||
|
owner: any,
|
||||||
|
multiSigners: Array<Account>,
|
||||||
|
amount: number | u64,
|
||||||
|
decimals: number,
|
||||||
|
): Promise<TransactionSignature> {
|
||||||
|
let ownerPublicKey;
|
||||||
|
let signers;
|
||||||
|
if (isAccount(owner)) {
|
||||||
|
ownerPublicKey = owner.publicKey;
|
||||||
|
signers = [owner];
|
||||||
|
} else {
|
||||||
|
ownerPublicKey = owner;
|
||||||
|
signers = multiSigners;
|
||||||
|
}
|
||||||
|
return await sendAndConfirmTransaction(
|
||||||
|
'Transfer2',
|
||||||
|
this.connection,
|
||||||
|
new Transaction().add(
|
||||||
|
Token.createTransfer2Instruction(
|
||||||
|
this.programId,
|
||||||
|
source,
|
||||||
|
this.publicKey,
|
||||||
|
destination,
|
||||||
|
ownerPublicKey,
|
||||||
|
multiSigners,
|
||||||
|
amount,
|
||||||
|
decimals,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
this.payer,
|
||||||
|
...signers,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Grant a third-party permission to transfer up the specified number of tokens from an account,
|
||||||
|
* asserting the token mint and decimals
|
||||||
|
*
|
||||||
|
* @param account Public key of the account
|
||||||
|
* @param delegate Account authorized to perform a transfer tokens from the source account
|
||||||
|
* @param owner Owner of the source account
|
||||||
|
* @param multiSigners Signing accounts if `owner` is a multiSig
|
||||||
|
* @param amount Maximum number of tokens the delegate may transfer
|
||||||
|
* @param decimals Number of decimals in approve amount
|
||||||
|
*/
|
||||||
|
async approve2(
|
||||||
|
account: PublicKey,
|
||||||
|
delegate: PublicKey,
|
||||||
|
owner: any,
|
||||||
|
multiSigners: Array<Account>,
|
||||||
|
amount: number | u64,
|
||||||
|
decimals: number,
|
||||||
|
): Promise<void> {
|
||||||
|
let ownerPublicKey;
|
||||||
|
let signers;
|
||||||
|
if (isAccount(owner)) {
|
||||||
|
ownerPublicKey = owner.publicKey;
|
||||||
|
signers = [owner];
|
||||||
|
} else {
|
||||||
|
ownerPublicKey = owner;
|
||||||
|
signers = multiSigners;
|
||||||
|
}
|
||||||
|
await sendAndConfirmTransaction(
|
||||||
|
'Approve2',
|
||||||
|
this.connection,
|
||||||
|
new Transaction().add(
|
||||||
|
Token.createApprove2Instruction(
|
||||||
|
this.programId,
|
||||||
|
account,
|
||||||
|
this.publicKey,
|
||||||
|
delegate,
|
||||||
|
ownerPublicKey,
|
||||||
|
multiSigners,
|
||||||
|
amount,
|
||||||
|
decimals,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
this.payer,
|
||||||
|
...signers,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mint new tokens, asserting the token mint and decimals
|
||||||
|
*
|
||||||
|
* @param dest Public key of the account to mint to
|
||||||
|
* @param authority Minting authority
|
||||||
|
* @param multiSigners Signing accounts if `authority` is a multiSig
|
||||||
|
* @param amount Amount to mint
|
||||||
|
* @param decimals Number of decimals in amount to mint
|
||||||
|
*/
|
||||||
|
async mintTo2(
|
||||||
|
dest: PublicKey,
|
||||||
|
authority: any,
|
||||||
|
multiSigners: Array<Account>,
|
||||||
|
amount: number,
|
||||||
|
decimals: number,
|
||||||
|
): Promise<void> {
|
||||||
|
let ownerPublicKey;
|
||||||
|
let signers;
|
||||||
|
if (isAccount(authority)) {
|
||||||
|
ownerPublicKey = authority.publicKey;
|
||||||
|
signers = [authority];
|
||||||
|
} else {
|
||||||
|
ownerPublicKey = authority;
|
||||||
|
signers = multiSigners;
|
||||||
|
}
|
||||||
|
await sendAndConfirmTransaction(
|
||||||
|
'MintTo2',
|
||||||
|
this.connection,
|
||||||
|
new Transaction().add(
|
||||||
|
Token.createMintTo2Instruction(
|
||||||
|
this.programId,
|
||||||
|
this.publicKey,
|
||||||
|
dest,
|
||||||
|
ownerPublicKey,
|
||||||
|
multiSigners,
|
||||||
|
amount,
|
||||||
|
decimals,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
this.payer,
|
||||||
|
...signers,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Burn tokens, asserting the token mint and decimals
|
||||||
|
*
|
||||||
|
* @param account Account to burn tokens from
|
||||||
|
* @param owner Account owner
|
||||||
|
* @param multiSigners Signing accounts if `owner` is a multiSig
|
||||||
|
* @param amount Amount to burn
|
||||||
|
* @param decimals Number of decimals in amount to burn
|
||||||
|
*/
|
||||||
|
async burn2(
|
||||||
|
account: PublicKey,
|
||||||
|
owner: any,
|
||||||
|
multiSigners: Array<Account>,
|
||||||
|
amount: number,
|
||||||
|
decimals: number,
|
||||||
|
): Promise<void> {
|
||||||
|
let ownerPublicKey;
|
||||||
|
let signers;
|
||||||
|
if (isAccount(owner)) {
|
||||||
|
ownerPublicKey = owner.publicKey;
|
||||||
|
signers = [owner];
|
||||||
|
} else {
|
||||||
|
ownerPublicKey = owner;
|
||||||
|
signers = multiSigners;
|
||||||
|
}
|
||||||
|
await sendAndConfirmTransaction(
|
||||||
|
'Burn2',
|
||||||
|
this.connection,
|
||||||
|
new Transaction().add(
|
||||||
|
Token.createBurn2Instruction(
|
||||||
|
this.programId,
|
||||||
|
this.publicKey,
|
||||||
|
account,
|
||||||
|
ownerPublicKey,
|
||||||
|
multiSigners,
|
||||||
|
amount,
|
||||||
|
decimals,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
this.payer,
|
||||||
|
...signers,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct an init mint instruction
|
* Construct an init mint instruction
|
||||||
*
|
*
|
||||||
* @param programId SPL Token program account
|
* @param programId SPL Token program account
|
||||||
* @param mint Token mint account
|
* @param mint Token mint account
|
||||||
* @param token New token account
|
* @param decimals Number of decimals in token account amounts
|
||||||
* @param owner Owner of the new token account
|
* @param mintAuthority Minting authority
|
||||||
|
* @param freezeAuthority Optional authority that can freeze token accounts
|
||||||
*/
|
*/
|
||||||
static createInitMintInstruction(
|
static createInitMintInstruction(
|
||||||
programId: PublicKey,
|
programId: PublicKey,
|
||||||
|
@ -993,6 +1255,7 @@ export class Token {
|
||||||
/**
|
/**
|
||||||
* Construct a Transfer instruction
|
* Construct a Transfer instruction
|
||||||
*
|
*
|
||||||
|
* @param programId SPL Token program account
|
||||||
* @param source Source account
|
* @param source Source account
|
||||||
* @param destination Destination account
|
* @param destination Destination account
|
||||||
* @param owner Owner of the source account
|
* @param owner Owner of the source account
|
||||||
|
@ -1051,6 +1314,7 @@ export class Token {
|
||||||
/**
|
/**
|
||||||
* Construct an Approve instruction
|
* Construct an Approve instruction
|
||||||
*
|
*
|
||||||
|
* @param programId SPL Token program account
|
||||||
* @param account Public key of the account
|
* @param account Public key of the account
|
||||||
* @param delegate Account authorized to perform a transfer of tokens from the source account
|
* @param delegate Account authorized to perform a transfer of tokens from the source account
|
||||||
* @param owner Owner of the source account
|
* @param owner Owner of the source account
|
||||||
|
@ -1104,13 +1368,12 @@ export class Token {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct an Approve instruction
|
* Construct a Revoke instruction
|
||||||
*
|
*
|
||||||
|
* @param programId SPL Token program account
|
||||||
* @param account Public key of the account
|
* @param account Public key of the account
|
||||||
* @param delegate Account authorized to perform a transfer of tokens from the source account
|
|
||||||
* @param owner Owner of the source account
|
* @param owner Owner of the source account
|
||||||
* @param multiSigners Signing accounts if `owner` is a multiSig
|
* @param multiSigners Signing accounts if `owner` is a multiSig
|
||||||
* @param amount Maximum number of tokens the delegate may transfer
|
|
||||||
*/
|
*/
|
||||||
static createRevokeInstruction(
|
static createRevokeInstruction(
|
||||||
programId: PublicKey,
|
programId: PublicKey,
|
||||||
|
@ -1152,6 +1415,7 @@ export class Token {
|
||||||
/**
|
/**
|
||||||
* Construct a SetAuthority instruction
|
* Construct a SetAuthority instruction
|
||||||
*
|
*
|
||||||
|
* @param programId SPL Token program account
|
||||||
* @param account Public key of the account
|
* @param account Public key of the account
|
||||||
* @param newAuthority New authority of the account
|
* @param newAuthority New authority of the account
|
||||||
* @param authorityType Type of authority to set
|
* @param authorityType Type of authority to set
|
||||||
|
@ -1211,10 +1475,12 @@ export class Token {
|
||||||
/**
|
/**
|
||||||
* Construct a MintTo instruction
|
* Construct a MintTo instruction
|
||||||
*
|
*
|
||||||
|
* @param programId SPL Token program account
|
||||||
|
* @param mint Public key of the mint
|
||||||
* @param dest Public key of the account to mint to
|
* @param dest Public key of the account to mint to
|
||||||
* @param authority The mint authority
|
* @param authority The mint authority
|
||||||
* @param multiSigners Signing accounts if `authority` is a multiSig
|
* @param multiSigners Signing accounts if `authority` is a multiSig
|
||||||
* @param amount amount to mint
|
* @param amount Amount to mint
|
||||||
*/
|
*/
|
||||||
static createMintToInstruction(
|
static createMintToInstruction(
|
||||||
programId: PublicKey,
|
programId: PublicKey,
|
||||||
|
@ -1269,6 +1535,7 @@ export class Token {
|
||||||
/**
|
/**
|
||||||
* Construct a Burn instruction
|
* Construct a Burn instruction
|
||||||
*
|
*
|
||||||
|
* @param programId SPL Token program account
|
||||||
* @param mint Mint for the account
|
* @param mint Mint for the account
|
||||||
* @param account Account to burn tokens from
|
* @param account Account to burn tokens from
|
||||||
* @param owner Owner of the account
|
* @param owner Owner of the account
|
||||||
|
@ -1326,10 +1593,12 @@ export class Token {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a Burn instruction
|
* Construct a Close instruction
|
||||||
*
|
*
|
||||||
* @param account Account to burn tokens from
|
* @param programId SPL Token program account
|
||||||
* @param owner account owner
|
* @param account Account to close
|
||||||
|
* @param dest Account to receive the remaining balance of the closed account
|
||||||
|
* @param authority Account Close authority
|
||||||
* @param multiSigners Signing accounts if `owner` is a multiSig
|
* @param multiSigners Signing accounts if `owner` is a multiSig
|
||||||
*/
|
*/
|
||||||
static createCloseAccountInstruction(
|
static createCloseAccountInstruction(
|
||||||
|
@ -1371,4 +1640,358 @@ export class Token {
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a Freeze instruction
|
||||||
|
*
|
||||||
|
* @param programId SPL Token program account
|
||||||
|
* @param account Account to freeze
|
||||||
|
* @param mint Mint account
|
||||||
|
* @param authority Mint freeze authority
|
||||||
|
* @param multiSigners Signing accounts if `owner` is a multiSig
|
||||||
|
*/
|
||||||
|
static createFreezeAccountInstruction(
|
||||||
|
programId: PublicKey,
|
||||||
|
account: PublicKey,
|
||||||
|
mint: PublicKey,
|
||||||
|
authority: PublicKey,
|
||||||
|
multiSigners: Array<Account>,
|
||||||
|
): TransactionInstruction {
|
||||||
|
const dataLayout = BufferLayout.struct([BufferLayout.u8('instruction')]);
|
||||||
|
const data = Buffer.alloc(dataLayout.span);
|
||||||
|
dataLayout.encode(
|
||||||
|
{
|
||||||
|
instruction: 10, // FreezeAccount instruction
|
||||||
|
},
|
||||||
|
data,
|
||||||
|
);
|
||||||
|
|
||||||
|
let keys = [
|
||||||
|
{pubkey: account, isSigner: false, isWritable: true},
|
||||||
|
{pubkey: mint, isSigner: false, isWritable: false},
|
||||||
|
];
|
||||||
|
if (multiSigners.length === 0) {
|
||||||
|
keys.push({pubkey: authority, isSigner: true, isWritable: false});
|
||||||
|
} else {
|
||||||
|
keys.push({pubkey: authority, isSigner: false, isWritable: false});
|
||||||
|
multiSigners.forEach(signer =>
|
||||||
|
keys.push({
|
||||||
|
pubkey: signer.publicKey,
|
||||||
|
isSigner: true,
|
||||||
|
isWritable: false,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TransactionInstruction({
|
||||||
|
keys,
|
||||||
|
programId: programId,
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a Thaw instruction
|
||||||
|
*
|
||||||
|
* @param programId SPL Token program account
|
||||||
|
* @param account Account to thaw
|
||||||
|
* @param mint Mint account
|
||||||
|
* @param authority Mint freeze authority
|
||||||
|
* @param multiSigners Signing accounts if `owner` is a multiSig
|
||||||
|
*/
|
||||||
|
static createThawAccountInstruction(
|
||||||
|
programId: PublicKey,
|
||||||
|
account: PublicKey,
|
||||||
|
mint: PublicKey,
|
||||||
|
authority: PublicKey,
|
||||||
|
multiSigners: Array<Account>,
|
||||||
|
): TransactionInstruction {
|
||||||
|
const dataLayout = BufferLayout.struct([BufferLayout.u8('instruction')]);
|
||||||
|
const data = Buffer.alloc(dataLayout.span);
|
||||||
|
dataLayout.encode(
|
||||||
|
{
|
||||||
|
instruction: 11, // ThawAccount instruction
|
||||||
|
},
|
||||||
|
data,
|
||||||
|
);
|
||||||
|
|
||||||
|
let keys = [
|
||||||
|
{pubkey: account, isSigner: false, isWritable: true},
|
||||||
|
{pubkey: mint, isSigner: false, isWritable: false},
|
||||||
|
];
|
||||||
|
if (multiSigners.length === 0) {
|
||||||
|
keys.push({pubkey: authority, isSigner: true, isWritable: false});
|
||||||
|
} else {
|
||||||
|
keys.push({pubkey: authority, isSigner: false, isWritable: false});
|
||||||
|
multiSigners.forEach(signer =>
|
||||||
|
keys.push({
|
||||||
|
pubkey: signer.publicKey,
|
||||||
|
isSigner: true,
|
||||||
|
isWritable: false,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TransactionInstruction({
|
||||||
|
keys,
|
||||||
|
programId: programId,
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a Transfer2 instruction
|
||||||
|
*
|
||||||
|
* @param programId SPL Token program account
|
||||||
|
* @param source Source account
|
||||||
|
* @param mint Mint account
|
||||||
|
* @param destination Destination account
|
||||||
|
* @param owner Owner of the source account
|
||||||
|
* @param multiSigners Signing accounts if `authority` is a multiSig
|
||||||
|
* @param amount Number of tokens to transfer
|
||||||
|
* @param decimals Number of decimals in transfer amount
|
||||||
|
*/
|
||||||
|
static createTransfer2Instruction(
|
||||||
|
programId: PublicKey,
|
||||||
|
source: PublicKey,
|
||||||
|
mint: PublicKey,
|
||||||
|
destination: PublicKey,
|
||||||
|
owner: PublicKey,
|
||||||
|
multiSigners: Array<Account>,
|
||||||
|
amount: number | u64,
|
||||||
|
decimals: number,
|
||||||
|
): TransactionInstruction {
|
||||||
|
const dataLayout = BufferLayout.struct([
|
||||||
|
BufferLayout.u8('instruction'),
|
||||||
|
Layout.uint64('amount'),
|
||||||
|
BufferLayout.u8('decimals'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
const data = Buffer.alloc(dataLayout.span);
|
||||||
|
dataLayout.encode(
|
||||||
|
{
|
||||||
|
instruction: 12, // Transfer2 instruction
|
||||||
|
amount: new u64(amount).toBuffer(),
|
||||||
|
decimals,
|
||||||
|
},
|
||||||
|
data,
|
||||||
|
);
|
||||||
|
|
||||||
|
let keys = [
|
||||||
|
{pubkey: source, isSigner: false, isWritable: true},
|
||||||
|
{pubkey: mint, isSigner: false, isWritable: false},
|
||||||
|
{pubkey: destination, isSigner: false, isWritable: true},
|
||||||
|
];
|
||||||
|
if (multiSigners.length === 0) {
|
||||||
|
keys.push({
|
||||||
|
pubkey: owner,
|
||||||
|
isSigner: true,
|
||||||
|
isWritable: false,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
keys.push({pubkey: owner, isSigner: false, isWritable: false});
|
||||||
|
multiSigners.forEach(signer =>
|
||||||
|
keys.push({
|
||||||
|
pubkey: signer.publicKey,
|
||||||
|
isSigner: true,
|
||||||
|
isWritable: false,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return new TransactionInstruction({
|
||||||
|
keys,
|
||||||
|
programId: programId,
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct an Approve2 instruction
|
||||||
|
*
|
||||||
|
* @param programId SPL Token program account
|
||||||
|
* @param account Public key of the account
|
||||||
|
* @param mint Mint account
|
||||||
|
* @param delegate Account authorized to perform a transfer of tokens from the source account
|
||||||
|
* @param owner Owner of the source account
|
||||||
|
* @param multiSigners Signing accounts if `owner` is a multiSig
|
||||||
|
* @param amount Maximum number of tokens the delegate may transfer
|
||||||
|
* @param decimals Number of decimals in approve amount
|
||||||
|
*/
|
||||||
|
static createApprove2Instruction(
|
||||||
|
programId: PublicKey,
|
||||||
|
account: PublicKey,
|
||||||
|
mint: PublicKey,
|
||||||
|
delegate: PublicKey,
|
||||||
|
owner: PublicKey,
|
||||||
|
multiSigners: Array<Account>,
|
||||||
|
amount: number | u64,
|
||||||
|
decimals: number,
|
||||||
|
): TransactionInstruction {
|
||||||
|
const dataLayout = BufferLayout.struct([
|
||||||
|
BufferLayout.u8('instruction'),
|
||||||
|
Layout.uint64('amount'),
|
||||||
|
BufferLayout.u8('decimals'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
const data = Buffer.alloc(dataLayout.span);
|
||||||
|
dataLayout.encode(
|
||||||
|
{
|
||||||
|
instruction: 13, // Approve2 instruction
|
||||||
|
amount: new u64(amount).toBuffer(),
|
||||||
|
decimals,
|
||||||
|
},
|
||||||
|
data,
|
||||||
|
);
|
||||||
|
|
||||||
|
let keys = [
|
||||||
|
{pubkey: account, isSigner: false, isWritable: true},
|
||||||
|
{pubkey: mint, isSigner: false, isWritable: false},
|
||||||
|
{pubkey: delegate, isSigner: false, isWritable: false},
|
||||||
|
];
|
||||||
|
if (multiSigners.length === 0) {
|
||||||
|
keys.push({pubkey: owner, isSigner: true, isWritable: false});
|
||||||
|
} else {
|
||||||
|
keys.push({pubkey: owner, isSigner: false, isWritable: false});
|
||||||
|
multiSigners.forEach(signer =>
|
||||||
|
keys.push({
|
||||||
|
pubkey: signer.publicKey,
|
||||||
|
isSigner: true,
|
||||||
|
isWritable: false,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TransactionInstruction({
|
||||||
|
keys,
|
||||||
|
programId: programId,
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a MintTo2 instruction
|
||||||
|
*
|
||||||
|
* @param programId SPL Token program account
|
||||||
|
* @param mint Public key of the mint
|
||||||
|
* @param dest Public key of the account to mint to
|
||||||
|
* @param authority The mint authority
|
||||||
|
* @param multiSigners Signing accounts if `authority` is a multiSig
|
||||||
|
* @param amount Amount to mint
|
||||||
|
* @param decimals Number of decimals in amount to mint
|
||||||
|
*/
|
||||||
|
static createMintTo2Instruction(
|
||||||
|
programId: PublicKey,
|
||||||
|
mint: PublicKey,
|
||||||
|
dest: PublicKey,
|
||||||
|
authority: PublicKey,
|
||||||
|
multiSigners: Array<Account>,
|
||||||
|
amount: number,
|
||||||
|
decimals: number,
|
||||||
|
): TransactionInstruction {
|
||||||
|
const dataLayout = BufferLayout.struct([
|
||||||
|
BufferLayout.u8('instruction'),
|
||||||
|
Layout.uint64('amount'),
|
||||||
|
BufferLayout.u8('decimals'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
const data = Buffer.alloc(dataLayout.span);
|
||||||
|
dataLayout.encode(
|
||||||
|
{
|
||||||
|
instruction: 14, // MintTo2 instruction
|
||||||
|
amount: new u64(amount).toBuffer(),
|
||||||
|
decimals,
|
||||||
|
},
|
||||||
|
data,
|
||||||
|
);
|
||||||
|
|
||||||
|
let keys = [
|
||||||
|
{pubkey: mint, isSigner: false, isWritable: true},
|
||||||
|
{pubkey: dest, isSigner: false, isWritable: true},
|
||||||
|
];
|
||||||
|
if (multiSigners.length === 0) {
|
||||||
|
keys.push({
|
||||||
|
pubkey: authority,
|
||||||
|
isSigner: true,
|
||||||
|
isWritable: false,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
keys.push({pubkey: authority, isSigner: false, isWritable: false});
|
||||||
|
multiSigners.forEach(signer =>
|
||||||
|
keys.push({
|
||||||
|
pubkey: signer.publicKey,
|
||||||
|
isSigner: true,
|
||||||
|
isWritable: false,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TransactionInstruction({
|
||||||
|
keys,
|
||||||
|
programId: programId,
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a Burn2 instruction
|
||||||
|
*
|
||||||
|
* @param programId SPL Token program account
|
||||||
|
* @param mint Mint for the account
|
||||||
|
* @param account Account to burn tokens from
|
||||||
|
* @param owner Owner of the account
|
||||||
|
* @param multiSigners Signing accounts if `authority` is a multiSig
|
||||||
|
* @param amount amount to burn
|
||||||
|
*/
|
||||||
|
static createBurn2Instruction(
|
||||||
|
programId: PublicKey,
|
||||||
|
mint: PublicKey,
|
||||||
|
account: PublicKey,
|
||||||
|
owner: PublicKey,
|
||||||
|
multiSigners: Array<Account>,
|
||||||
|
amount: number,
|
||||||
|
decimals: number,
|
||||||
|
): TransactionInstruction {
|
||||||
|
const dataLayout = BufferLayout.struct([
|
||||||
|
BufferLayout.u8('instruction'),
|
||||||
|
Layout.uint64('amount'),
|
||||||
|
BufferLayout.u8('decimals'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
const data = Buffer.alloc(dataLayout.span);
|
||||||
|
dataLayout.encode(
|
||||||
|
{
|
||||||
|
instruction: 15, // Burn2 instruction
|
||||||
|
amount: new u64(amount).toBuffer(),
|
||||||
|
decimals,
|
||||||
|
},
|
||||||
|
data,
|
||||||
|
);
|
||||||
|
|
||||||
|
let keys = [
|
||||||
|
{pubkey: account, isSigner: false, isWritable: true},
|
||||||
|
{pubkey: mint, isSigner: false, isWritable: true},
|
||||||
|
];
|
||||||
|
if (multiSigners.length === 0) {
|
||||||
|
keys.push({
|
||||||
|
pubkey: owner,
|
||||||
|
isSigner: true,
|
||||||
|
isWritable: false,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
keys.push({pubkey: owner, isSigner: false, isWritable: false});
|
||||||
|
multiSigners.forEach(signer =>
|
||||||
|
keys.push({
|
||||||
|
pubkey: signer.publicKey,
|
||||||
|
isSigner: true,
|
||||||
|
isWritable: false,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TransactionInstruction({
|
||||||
|
keys,
|
||||||
|
programId: programId,
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@solana/spl-token",
|
"name": "@solana/spl-token",
|
||||||
"version": "0.0.7",
|
"version": "0.0.8",
|
||||||
"description": "SPL Token JavaScript API",
|
"description": "SPL Token JavaScript API",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"author": "Solana Maintainers <maintainers@solana.com>",
|
"author": "Solana Maintainers <maintainers@solana.com>",
|
||||||
|
|
Loading…
Reference in New Issue