MsgAuthorization
MsgAuthorization#
The following code snippet requires LocalTerra.
test1
creates MsgGrantAuthorization message to grant MsgSend authorization to granteetest2
.test2
creates MsgExecAuthorized message to send2000000000000ukrw
from thetest1
account to thetest3
account.
import {
LCDClient,
MnemonicKey,
Wallet,
MsgGrantAuthorization,
SendAuthorization,
MsgSend,
Int,
MsgExecAuthorized,
Coins,
} from "@terra-money/terra.js";
function grant(
granter: Wallet,
grantee: string,
spendLimit: Coins.Input,
duration: Int
) {
const msgs = [
new MsgGrantAuthorization(
granter.key.accAddress,
grantee,
new SendAuthorization(spendLimit),
duration
),
];
return granter.createAndSignTx({ msgs });
}
function sendAuthorized(
granter: Wallet,
grantee: Wallet,
to: string,
amount: Coins.Input
) {
const msgs = [
new MsgExecAuthorized(grantee.key.accAddress, [
new MsgSend(
granter.key.accAddress, // From test1
to,
amount
),
]),
];
return grantee.createAndSignTx({ msgs });
}
async function main() {
const client = new LCDClient({
URL: "http://localhost:1317/",
chainID: "localterra",
gasPrices: "169.77ukrw",
});
// Granter (terra1x46rqay4d3cssq8gxxvqz8xt6nwlz4td20k38v)
const granter = client.wallet(
new MnemonicKey({
mnemonic:
"notice oak worry limit wrap speak medal online prefer cluster roof addict wrist behave treat actual wasp year salad speed social layer crew genius",
})
);
// Grantee (terra17lmam6zguazs5q5u6z5mmx76uj63gldnse2pdp)
const grantee = client.wallet(
new MnemonicKey({
mnemonic:
"quality vacuum heart guard buzz spike sight swarm shove special gym robust assume sudden deposit grid alcohol choice devote leader tilt noodle tide penalty",
})
);
// MsgGrantAuthorization
await grant(
granter,
grantee.key.accAddress,
// Set enough spend limit since it will be decreased upon every MsgSend transactions
"1000000000000000ukrw,1000000000000uluna",
// expire after 100 year
new Int(86400 * 365 * 100 * 1000000000)
)
.then((tx) => client.tx.broadcast(tx))
.then(console.info)
.catch((err) => {
if (err.response) {
console.error(err.response.data);
} else {
console.error(err.message);
}
});
// MsgExecAuthorized of MsgSend
await sendAuthorized(
granter,
grantee,
// Test3
"terra1757tkx08n0cqrw7p86ny9lnxsqeth0wgp0em95",
"2000000000000ukrw"
)
.then((tx) => client.tx.broadcast(tx))
.then(console.info)
.catch((err) => {
if (err.response) {
// unauthorized: authorization not found: failed to execute message; message index: 0: failed to simulate tx
// happenes when there's not enough amount of granted amount of token
// insufficient funds: insufficient account funds; ...
// happenes when granter does not have enough amount of token
console.error(err.response.data);
} else {
console.error(err.message);
}
});
}
main().catch(console.error);