132 lines
3.8 KiB
JavaScript
132 lines
3.8 KiB
JavaScript
/*
|
|
Example of using the Budget program to perform a time-lock payment of 50
|
|
tokens from account1 to account2.
|
|
*/
|
|
|
|
//eslint-disable-next-line import/no-commonjs
|
|
const solanaWeb3 = require('..');
|
|
//const solanaWeb3 = require('@solana/web3.js');
|
|
|
|
const account1 = new solanaWeb3.Account();
|
|
const account2 = new solanaWeb3.Account();
|
|
const contractFunds = new solanaWeb3.Account();
|
|
const contractState = new solanaWeb3.Account();
|
|
|
|
let url;
|
|
url = 'http://localhost:8899';
|
|
//url = 'https://api.testnet.solana.com/master';
|
|
//url = 'https://api.testnet.solana.com';
|
|
const connection = new solanaWeb3.Connection(url);
|
|
|
|
function showBalance() {
|
|
console.log(`\n== Account State`);
|
|
return Promise.all([
|
|
connection.getBalance(account1.publicKey),
|
|
connection.getBalance(account2.publicKey),
|
|
connection.getBalance(contractFunds.publicKey),
|
|
connection.getBalance(contractState.publicKey),
|
|
]).then(
|
|
([fromBalance, toBalance, contractFundsBalance, contractStateBalance]) => {
|
|
console.log(
|
|
`Account1: ${account1.publicKey} has a balance of ${fromBalance}`,
|
|
);
|
|
console.log(
|
|
`Account2: ${account2.publicKey} has a balance of ${toBalance}`,
|
|
);
|
|
console.log(
|
|
`Contract Funds: ${
|
|
contractFunds.publicKey
|
|
} has a balance of ${contractFundsBalance}`,
|
|
);
|
|
console.log(
|
|
`Contract State: ${
|
|
contractState.publicKey
|
|
} has a balance of ${contractStateBalance}`,
|
|
);
|
|
},
|
|
);
|
|
}
|
|
|
|
function confirmTransaction(signature) {
|
|
console.log('Confirming transaction:', signature);
|
|
return connection.getSignatureStatus(signature).then(confirmation => {
|
|
if (confirmation !== 'Confirmed') {
|
|
throw new Error(`Transaction was not confirmed (${confirmation})`);
|
|
}
|
|
console.log('Transaction confirmed');
|
|
});
|
|
}
|
|
|
|
function airDrop() {
|
|
console.log(`\n== Requesting airdrop of 100 to ${account1.publicKey}`);
|
|
return connection
|
|
.requestAirdrop(account1.publicKey, 100)
|
|
.then(confirmTransaction);
|
|
}
|
|
|
|
showBalance()
|
|
.then(airDrop)
|
|
.then(showBalance)
|
|
.then(() => {
|
|
console.log(`\n== Creating account for the contract funds`);
|
|
const transaction = solanaWeb3.SystemProgram.createAccount(
|
|
account1.publicKey,
|
|
contractFunds.publicKey,
|
|
50, // number of tokens to transfer
|
|
0,
|
|
solanaWeb3.BudgetProgram.programId,
|
|
);
|
|
return connection.sendTransaction(transaction, account1);
|
|
})
|
|
.then(confirmTransaction)
|
|
.then(showBalance)
|
|
.then(() => {
|
|
console.log(`\n== Creating account for the contract state`);
|
|
const transaction = solanaWeb3.SystemProgram.createAccount(
|
|
account1.publicKey,
|
|
contractState.publicKey,
|
|
1, // account1 pays 1 token to hold the contract state
|
|
solanaWeb3.BudgetProgram.space,
|
|
solanaWeb3.BudgetProgram.programId,
|
|
);
|
|
return connection.sendTransaction(transaction, account1);
|
|
})
|
|
.then(confirmTransaction)
|
|
.then(showBalance)
|
|
.then(() => {
|
|
console.log(`\n== Initializing contract`);
|
|
const transaction = solanaWeb3.BudgetProgram.pay(
|
|
contractFunds.publicKey,
|
|
contractState.publicKey,
|
|
account2.publicKey,
|
|
50,
|
|
solanaWeb3.BudgetProgram.timestampCondition(
|
|
account1.publicKey,
|
|
new Date('2050'),
|
|
),
|
|
);
|
|
return connection.sendTransaction(transaction, contractFunds);
|
|
})
|
|
.then(confirmTransaction)
|
|
.then(showBalance)
|
|
.then(() => {
|
|
console.log(`\n== Witness contract`);
|
|
const transaction = solanaWeb3.BudgetProgram.applyTimestamp(
|
|
account1.publicKey,
|
|
contractState.publicKey,
|
|
account2.publicKey,
|
|
new Date('2050'),
|
|
);
|
|
return connection.sendTransaction(transaction, account1);
|
|
})
|
|
.then(confirmTransaction)
|
|
.then(showBalance)
|
|
|
|
.then(() => {
|
|
console.log('\nDone');
|
|
})
|
|
|
|
.catch(err => {
|
|
console.log(err);
|
|
});
|