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);