Skip to content

Cw20 ics20 upgrade testing #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: cw20-ics20-upgrade
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions contracts/cw20-ics20/test/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
version: "3.9"
services:
localsecret-1:
image: "ghcr.io/scrtlabs/localsecret:v1.5.0-beta.1"
image: "ghcr.io/scrtlabs/localsecret:v1.14.0"
# ports are only here in case interaction
# between localhost and container is desired
ports:
Expand All @@ -13,9 +13,10 @@ services:
# faucet
- "5000:5000"
environment:
FAST_BLOCKS: "true"
LOG_LEVEL: "TRACE"
localsecret-2:
image: "ghcr.io/scrtlabs/localsecret:v1.5.0-beta.1"
image: "ghcr.io/scrtlabs/localsecret:v1.14.0"
# ports are only here in case interaction
# between localhost and container is desired
ports:
Expand All @@ -27,5 +28,6 @@ services:
# faucet
- "5300:5000"
environment:
FAST_BLOCKS: "true"
CHAINID: "secretdev-2"
LOG_LEVEL: "TRACE"
8 changes: 4 additions & 4 deletions contracts/cw20-ics20/test/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
"version": "0.0.0",
"license": "MIT",
"devDependencies": {
"@confio/relayer": "0.0.0-main-3b30964",
"@cosmjs/stargate": "0.29.0",
"@confio/relayer": "0.12.0",
"@cosmjs/stargate": "0.32.3",
"@noble/hashes": "1.1.2",
"@types/jest": "28.1.7",
"@types/node": "18.7.9",
"jest": "28.1.3",
"jest": "^28.1.3",
"prettier": "2.7.1",
"secretjs": "1.4.3",
"secretjs": "1.12.5",
"ts-jest": "28.0.8",
"ts-node": "10.9.1",
"typescript": "4.7.4"
Expand Down
110 changes: 60 additions & 50 deletions contracts/cw20-ics20/test/test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ import {
TxResultCode,
Wallet,
} from "secretjs";
import { MsgInstantiateContractResponse } from "secretjs/dist/protobuf_stuff/secret/compute/v1beta1/msg";
// import { MsgInstantiateContractResponse } from "secretjs/dist/protobuf_stuff/secret/compute/v1beta1/msg";
import { MsgInstantiateContractResponse } from "secretjs/dist/protobuf/secret/compute/v1beta1/msg";
import { AminoWallet } from "secretjs/dist/wallet_amino";
import { ibcDenom, loopRelayer, sleep, createIbcConnection, waitForBlocks, createIbcChannel } from "./utils";

Expand All @@ -31,7 +32,7 @@ type Contract = {
address: string;
codeId: number;
ibcPortId: string;
codeHash: string;
code_hash: string;
};

const contracts: { snip20: Contract; ics20: Contract } = {
Expand All @@ -40,22 +41,23 @@ const contracts: { snip20: Contract; ics20: Contract } = {
address: "",
codeId: -1,
ibcPortId: "",
codeHash: "",
code_hash: "",
},
ics20: {
wasm: new Uint8Array(),
address: "",
codeId: -1,
ibcPortId: "",
codeHash: "",
code_hash: "",
},
};

let channelId1 = "";
let channelId2 = "";

beforeAll(async () => {
const linkPromise = createIbcConnection();
console.log("Waiting for IBC connection...");
const link = await createIbcConnection();

const mnemonics = [
"grant rice replace explain federal release fix clever romance raise often wild taxi quarter soccer fiber love must tape steak together observe swap guitar",
Expand All @@ -66,15 +68,16 @@ beforeAll(async () => {
for (let i = 0; i < mnemonics.length; i++) {
const mnemonic = mnemonics[i];
const walletAmino = new AminoWallet(mnemonic);
const walletProto = new Wallet(mnemonic);
accounts1[i] = {
address: walletAmino.address,
mnemonic: mnemonic,
walletAmino,
walletProto: new Wallet(mnemonic),
secretjs: await SecretNetworkClient.create({
grpcWebUrl: "http://localhost:9091",
wallet: walletAmino,
walletAddress: walletAmino.address,
walletProto,
secretjs: new SecretNetworkClient({
url: "http://localhost:1317",
wallet: walletProto,
walletAddress: walletProto.address,
chainId: "secretdev-1",
}),
};
Expand All @@ -84,42 +87,43 @@ beforeAll(async () => {
for (let i = 0; i < mnemonics.length; i++) {
const mnemonic = mnemonics[i];
const walletAmino = new AminoWallet(mnemonic);
const walletProto = new Wallet(mnemonic);
accounts2[i] = {
address: walletAmino.address,
mnemonic: mnemonic,
walletAmino,
walletProto: new Wallet(mnemonic),
secretjs: await SecretNetworkClient.create({
grpcWebUrl: "http://localhost:9391",
wallet: walletAmino,
walletAddress: walletAmino.address,
walletProto,
secretjs: new SecretNetworkClient({
url: "http://localhost:3317",
wallet: walletProto,
walletAddress: walletProto.address,
chainId: "secretdev-2",
}),
};
}

await waitForBlocks("secretdev-1", "http://localhost:9091");
await waitForBlocks("secretdev-2", "http://localhost:9391");
await waitForBlocks("secretdev-1", "http://localhost:1317");
await waitForBlocks("secretdev-2", "http://localhost:3317");

contracts.snip20.wasm = fs.readFileSync(`${__dirname}/snip20.wasm`) as Uint8Array;
contracts.ics20.wasm = fs.readFileSync(`${__dirname}/../contract.wasm`) as Uint8Array;

contracts.snip20.codeHash = toHex(sha256(contracts.snip20.wasm));
contracts.ics20.codeHash = toHex(sha256(contracts.ics20.wasm));
contracts.snip20.code_hash = toHex(sha256(contracts.snip20.wasm));
contracts.ics20.code_hash = toHex(sha256(contracts.ics20.wasm));

console.log("Storing contracts on secretdev-1...");

let tx = await accounts1[0].secretjs.tx.broadcast(
[
new MsgStoreCode({
sender: accounts1[0].address,
wasmByteCode: contracts.snip20.wasm,
wasm_byte_code: contracts.snip20.wasm,
source: "",
builder: "",
}),
new MsgStoreCode({
sender: accounts1[0].address,
wasmByteCode: contracts.ics20.wasm,
wasm_byte_code: contracts.ics20.wasm,
source: "",
builder: "",
}),
Expand All @@ -131,6 +135,7 @@ beforeAll(async () => {
}
expect(tx.code).toBe(TxResultCode.Success);


contracts.snip20.codeId = Number(tx.arrayLog.find((x) => x.key === "code_id").value);
contracts.ics20.codeId = Number(tx.arrayLog.reverse().find((x) => x.key === "code_id").value);

Expand All @@ -139,9 +144,9 @@ beforeAll(async () => {
tx = await accounts1[0].secretjs.tx.compute.instantiateContract(
{
sender: accounts1[0].address,
codeId: contracts.snip20.codeId,
codeHash: contracts.snip20.codeHash,
initMsg: {
code_id: contracts.snip20.codeId,
code_hash: contracts.snip20.code_hash,
init_msg: {
name: "Secret SCRT",
admin: accounts1[0].address,
symbol: "SSCRT",
Expand Down Expand Up @@ -170,14 +175,14 @@ beforeAll(async () => {
tx = await accounts1[0].secretjs.tx.compute.instantiateContract(
{
sender: accounts1[0].address,
codeId: contracts.ics20.codeId,
codeHash: contracts.ics20.codeHash,
initMsg: {
code_id: contracts.ics20.codeId,
code_hash: contracts.ics20.code_hash,
init_msg: {
admin: accounts1[0].address,
allowlist: [
{
contract: contracts.snip20.address,
code_hash: contracts.snip20.codeHash,
code_hash: contracts.snip20.code_hash,
},
],
},
Expand All @@ -193,9 +198,6 @@ beforeAll(async () => {
contracts.ics20.address = MsgInstantiateContractResponse.decode(tx.data[0]).address;
contracts.ics20.ibcPortId = "wasm." + contracts.ics20.address;

console.log("Waiting for IBC connection...");
const link = await linkPromise;

console.log("Creating IBC channel...");
const channels = await createIbcChannel(link, contracts.ics20.ibcPortId);

Expand All @@ -212,12 +214,13 @@ test(
// register snip20 on ics20, then send tokens from secretdev-1
console.log("Sending tokens from secretdev-1...");

const memo1 = "test memo from secretdev-1";
let tx = await accounts1[0].secretjs.tx.broadcast(
[
new MsgExecuteContract({
sender: accounts1[0].address,
contractAddress: contracts.snip20.address,
codeHash: contracts.snip20.codeHash,
contract_address: contracts.snip20.address,
code_hash: contracts.snip20.code_hash,
msg: {
set_viewing_key: {
key: "banana",
Expand All @@ -226,12 +229,12 @@ test(
}),
new MsgExecuteContract({
sender: accounts1[0].address,
contractAddress: contracts.snip20.address,
codeHash: contracts.snip20.codeHash,
contract_address: contracts.snip20.address,
code_hash: contracts.snip20.code_hash,
msg: {
send: {
recipient: contracts.ics20.address,
recipient_code_hash: contracts.ics20.codeHash,
recipient_code_hash: contracts.ics20.code_hash,
amount: "1",
msg: toBase64(
toUtf8(
Expand All @@ -242,7 +245,9 @@ test(
})
)
),
memo: memo1,
},
// memo: "test2 memo from secretdev-1",
},
}),
],
Expand All @@ -255,9 +260,13 @@ test(
}
expect(tx.code).toBe(TxResultCode.Success);

let res = tx.arrayLog.find(element => element.key === 'memo');
let receivedMemo = res ? res.value : undefined;
expect(receivedMemo).toBe(memo1);

let snip20Balance: any = await accounts1[0].secretjs.query.compute.queryContract({
contractAddress: contracts.snip20.address,
codeHash: contracts.snip20.codeHash,
contract_address: contracts.snip20.address,
code_hash: contracts.snip20.code_hash,
query: {
balance: {
key: "banana",
Expand Down Expand Up @@ -293,14 +302,15 @@ test(
// send tokens back from secretdev-2
tx = await accounts2[1].secretjs.tx.ibc.transfer({
sender: accounts2[1].address,
sourcePort: "transfer",
sourceChannel: channelId2,
source_port: "transfer",
source_channel: channelId2,
token: {
denom: expectedIbcDenom,
amount: "1",
},
receiver: accounts1[0].address,
timeoutTimestampSec: String(Math.floor(Date.now() / 1000) + 10 * 60) /* 10 minutes */,
timeout_timestamp: String(Math.floor(Date.now() / 1000) + 10 * 60) /* 10 minutes */,
memo: "test memo from secretdev-2"
});

if (tx.code !== TxResultCode.Success) {
Expand All @@ -312,8 +322,8 @@ test(

while (true) {
snip20Balance = await accounts1[0].secretjs.query.compute.queryContract({
contractAddress: contracts.snip20.address,
codeHash: contracts.snip20.codeHash,
contract_address: contracts.snip20.address,
code_hash: contracts.snip20.code_hash,
query: {
balance: { key: "banana", address: accounts1[0].address },
},
Expand All @@ -332,12 +342,12 @@ test(
[
new MsgExecuteContract({
sender: accounts1[0].address,
contractAddress: contracts.snip20.address,
codeHash: contracts.snip20.codeHash,
contract_address: contracts.snip20.address,
code_hash: contracts.snip20.code_hash,
msg: {
send: {
recipient: contracts.ics20.address,
recipient_code_hash: contracts.ics20.codeHash,
recipient_code_hash: contracts.ics20.code_hash,
amount: "1",
msg: toBase64(
toUtf8(
Expand All @@ -363,8 +373,8 @@ test(

// Balance is deducted optimistically so we should see 999 right away
snip20Balance = await accounts1[0].secretjs.query.compute.queryContract({
contractAddress: contracts.snip20.address,
codeHash: contracts.snip20.codeHash,
contract_address: contracts.snip20.address,
code_hash: contracts.snip20.code_hash,
query: {
balance: {
key: "banana",
Expand All @@ -378,8 +388,8 @@ test(

while (true) {
snip20Balance = await accounts1[0].secretjs.query.compute.queryContract({
contractAddress: contracts.snip20.address,
codeHash: contracts.snip20.codeHash,
contract_address: contracts.snip20.address,
code_hash: contracts.snip20.code_hash,
query: {
balance: { key: "banana", address: accounts1[0].address },
},
Expand Down
Loading