-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdeployer.ts
121 lines (95 loc) Β· 3.35 KB
/
deployer.ts
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
120
121
import {
Address,
balance,
callerHasWriteAccess,
Context,
createSC,
fileToByteArray,
generateEvent,
Storage,
transferCoins,
} from '@massalabs/massa-as-sdk';
import { IERC20, IFactory, IPair } from '../interfaces';
import { ONE_COIN, PRECISION } from '../libraries/Constants';
import { Args } from '@massalabs/as-types';
import { transferRemaining } from '../libraries/Utils';
import {
_setOwner,
_onlyOwner,
_isOwner,
} from '@massalabs/sc-standards/assembly/contracts/utils/ownership-internal';
import { u256 } from 'as-bignum/assembly/integer/u256';
export function constructor(_: StaticArray<u8>): void {
main(_);
}
const FACTORY = 'factory';
const ADMIN = 'admin';
export function main(bs: StaticArray<u8>): void {
assert(callerHasWriteAccess(), 'DUSER_PUMP: Already initialized');
Storage.set(FACTORY, new Args(bs).nextString().expect('factory is required'));
_setOwner(Context.caller().toString());
Storage.set(ADMIN, Context.caller().toString());
}
export function deploy(bs: StaticArray<u8>): StaticArray<u8> {
const SCBalance = balance();
const sent = Context.transferredCoins();
const args = new Args(bs);
const name = args.nextString().expect('name is required');
const symbol = args.nextString().expect('symbol is required');
const decimals = u8(18);
const totalSupply = u256.mul(u256.from(1_000_000_000), PRECISION);
const buyToken = args.nextU256();
const buyAmount = buyToken.isOk() ? buyToken.unwrap() : u256.Zero;
const wasm: StaticArray<u8> = fileToByteArray('build/ERC20.wasm');
const token = new IERC20(createSC(wasm));
transferCoins(token._origin, 5 * ONE_COIN);
token.init(name, symbol, decimals, totalSupply);
const factory = new IFactory(new Address(Storage.get(FACTORY)));
const pair = new IPair(factory.createPair(token._origin, 10 * ONE_COIN));
token.transfer(pair._origin, totalSupply);
pair.mint(Context.callee(), ONE_COIN);
if (u256.gt(buyAmount, u256.Zero)) {
pair.buy(buyAmount, u256.Zero, Context.caller(), Context.timestamp() + 10);
}
transferRemaining(SCBalance, balance(), sent, Context.caller());
return new Args().add(pair._origin).add(token._origin).serialize();
}
export function migratePool(bs: StaticArray<u8>): void {
_onlyAdmin();
const args = new Args(bs);
const pair = new IPair(
new Address(args.nextString().expect('pair is required')),
);
assert(pair.isLocked(), 'DUSER_PUMP: Pool is not locked');
const IERCPAIR = new IERC20(pair._origin);
IERCPAIR.transfer(pair._origin, u256.One);
pair.burn(Context.caller());
pair.deletePool();
}
export function changeOwner(bs: StaticArray<u8>): void {
_onlyOwner();
const newOwner = new Address(
new Args(bs).nextString().expect('newOwner is required'),
);
_setOwner(newOwner.toString());
}
export function setAdmin(bs: StaticArray<u8>): void {
_onlyOwner();
const newAdmin = new Address(
new Args(bs).nextString().expect('newAdmin is required'),
);
Storage.set(ADMIN, newAdmin.toString());
generateEvent('Admin changed to ' + newAdmin.toString());
}
function _onlyAdmin(): void {
assert(
_isOwner(Context.caller().toString()) ||
Context.caller().toString() === Storage.get(ADMIN),
'DUSER_PUMP: Caller is not the admin',
);
}
/**
* @notice Function used by an SC to receive Massa coins
* @param _ unused
*/
export function receiveCoins(_: StaticArray<u8>): void {}