You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

156 lines
4.1 KiB

import "@stdlib/ownable";
import "./wallet";
import "./linker";
import "./constants";
@interface("org.ton.jetton.master")
trait TONBTrait with Ownable {
//
// Storage
//
totalSupply: Int;
mintable: Bool;
owner: Address;
content: Cell?;
first_linker: Address?;
last_linker: Address?;
n_linkers: Int = 0;
//
// Receivers
//
receive(msg: TokenUpdateContent) {
// Allow changing content only by owner
self.requireOwner();
// Update content
self.content = msg.content;
}
receive(msg: TokenBurnNotification) {
// Check wallet
self.requireWallet(msg.owner);
// Update supply
self.totalSupply = self.totalSupply - msg.amount;
// Cashback
if (msg.responseAddress != null) {
send(SendParameters{
to: msg.responseAddress!!,
value: 0,
bounce: false,
mode: SendRemainingValue + SendIgnoreErrors,
body: TokenExcesses{
queryId: msg.queryId
}.toCell()
});
}
}
//
// Get Methods
//
get fun get_wallet_address(owner: Address): Address {
let winit: StateInit = self.getJettonWalletInit(owner);
return contractAddress(winit);
}
get fun get_jetton_data(): JettonData {
let code: Cell = self.getJettonWalletInit(myAddress()).code;
return JettonData{
totalSupply: self.totalSupply,
mintable: self.mintable,
owner: self.owner,
content: self.content,
walletCode: code
};
}
//
// Private Methods
//
fun mint(to: Address, amount: Int, responseAddress: Address?) {
// Update total supply
self.totalSupply = self.totalSupply + amount;
// Create message
let winit: StateInit = self.getJettonWalletInit(to);
let walletAddress: Address = contractAddress(winit);
let linker_init: StateInit = initOf Linker(self.n_linkers, walletAddress, myAddress());
let linker_address: Address = contractAddress(linker_init);
send(SendParameters{
to: linker_address,
value: linker_credit,
bounce: false,
body: SetLinkerNeighbor{
neighbor: self.last_linker
}.toCell(),
code: linker_init.code,
data: linker_init.data
});
self.last_linker = linker_address;
self.n_linkers = self.n_linkers + 1;
let wallet_msg_body: Cell = TokenTransferInternal{
amount: amount,
queryId: 0,
from: myAddress(),
responseAddress: responseAddress,
forwardTonAmount: 0,
forwardPayload: emptySlice(),
setLinker: linker_address
}.toCell();
send(SendParameters{
to: walletAddress,
value: wallet_credit,
bounce: false,
body: wallet_msg_body,
code: winit.code,
data: winit.data
});
}
fun burn(from: Address, amount: Int, responseAddress: Address?) {
// Create message
let winit: StateInit = self.getJettonWalletInit(from);
let walletAddress: Address = contractAddress(winit);
send(SendParameters{
to: walletAddress,
value: 0,
bounce: false,
mode: SendRemainingValue,
body: TokenBurn{
amount: amount,
queryId: 0,
responseAddress: responseAddress,
owner: from
}.toCell(),
code: winit.code,
data: winit.data
});
}
fun requireWallet(owner: Address) {
let ctx: Context = context();
let winit: StateInit = self.getJettonWalletInit(owner);
require(contractAddress(winit) == ctx.sender, "Invalid sender");
}
virtual fun getJettonWalletInit(address: Address): StateInit {
return initOf TONBWallet(myAddress(), address);
}
}