-
Notifications
You must be signed in to change notification settings - Fork 2
/
transferAlgo.js
119 lines (99 loc) · 3.79 KB
/
transferAlgo.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
const algosdk = require('algosdk');
// Standard Algod credentials in the Sandbox
const algodToken =
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
const algodServer = 'http://localhost';
const algodPort = '4001';
const algodClient = new algosdk.Algodv2(algodToken, algodServer, algodPort);
// Standard Kmd credentials in the Sandbox
const kmdToken =
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
const kmdServer = 'http://localhost';
const kmdPort = '4002';
const kmdClient = new algosdk.Kmd(kmdToken, kmdServer, kmdPort);
(async () => {
// The same demo credentials are used across all code examples.
// Avoid using them in production code.
const depositWalletPassword = 'Passw0rd!';
const defaultWalletPassword = ''; // no password for the default wallet in the Sandbox
// FIND ACCOUNT ADDRESSES
const { wallets } = await kmdClient.listWallets();
// Get the first one from Sandbox default addresses
const defaultWallet = wallets.find(
({ name }) => name === 'unencrypted-default-wallet'
);
const { wallet_handle_token: defaultWalletHandle } =
await kmdClient.initWalletHandle(defaultWallet.id, defaultWalletPassword);
const {
addresses: [defaultAddress]
} = await kmdClient.listKeys(defaultWalletHandle);
// Get first address from our deposit_wallet
const depositWallet = wallets.find(({ name }) => name === 'deposit_wallet');
const { wallet_handle_token: depositWalletHandle } =
await kmdClient.initWalletHandle(depositWallet.id, depositWalletPassword);
const {
addresses: [depositAddress]
} = await kmdClient.listKeys(depositWalletHandle);
// CREATE A TRANSACTION OBJECT
const sender = defaultAddress;
const receiver = depositAddress;
// Transaction amount must be specified in microAlgos
const amount = algosdk.algosToMicroalgos(0.5);
// Get transaction params template
const params = await algodClient.getTransactionParams().do();
const closeRemainderTo = undefined; // not used since we don't want to close the account
const note = undefined; // no additional notes
// Create new transaction object
const txo = algosdk.makePaymentTxnWithSuggestedParams(
sender,
receiver,
amount,
closeRemainderTo,
note,
params
);
// Sign the transaction
const blob = await kmdClient.signTransaction(
defaultWalletHandle,
defaultWalletPassword,
txo
);
// Send transaction to the Algorand network
const { txId } = await algodClient.sendRawTransaction(blob).do();
// Wait until the transaction is settled using a helper function (see below)
await waitForConfirmation(algodClient, txId);
const humanReadableAmount = algosdk.microalgosToAlgos(amount);
console.log(
`${humanReadableAmount} Algo transferred from ${sender} to ${receiver}`
);
})().catch((error) => {
console.error(error);
});
// HELPER FUNCTION
/**
* Resolves when transaction is confirmed.
*
* @param {Algodv2} algodClient Instance of the Algodv2 client
* @param {String} txId Transaction Id to watch on
* @param {Number} [timeout=60000] Waiting timeout (default: 1 minute)
* @return {Object} Transaction information
*/
async function waitForConfirmation(algodClient, txId, timeout = 60000) {
let { 'last-round': lastRound } = await algodClient.status().do();
while (timeout > 0) {
const startTime = Date.now();
// Get transaction details
const txInfo = await algodClient.pendingTransactionInformation(txId).do();
if (txInfo) {
if (txInfo['confirmed-round']) {
return txInfo;
} else if (txInfo['pool-error'] && txInfo['pool-error'].length > 0) {
throw new Error(txInfo['pool-error']);
}
}
// Wait for the next round
await algodClient.statusAfterBlock(++lastRound).do();
timeout -= Date.now() - startTime;
}
throw new Error('Timeout exceeded');
}