aptos/contracts: implement simple example contract
This commit is contained in:
parent
da39940b13
commit
70ccb69e86
|
@ -0,0 +1,7 @@
|
||||||
|
SUBDIRS := $(wildcard */)
|
||||||
|
|
||||||
|
TARGETS := build test
|
||||||
|
|
||||||
|
.PHONY: $(TARGETS)
|
||||||
|
$(TARGETS):
|
||||||
|
$(foreach dir,$(SUBDIRS),make -C $(dir) $@ &&) true
|
|
@ -0,0 +1,14 @@
|
||||||
|
-include ../../../Makefile.help
|
||||||
|
|
||||||
|
.PHONY: artifacts
|
||||||
|
artifacts: build
|
||||||
|
|
||||||
|
.PHONY: build
|
||||||
|
## Build contract
|
||||||
|
build:
|
||||||
|
aptos move compile --save-metadata
|
||||||
|
|
||||||
|
.PHONY: test
|
||||||
|
## Run tests
|
||||||
|
test:
|
||||||
|
aptos move test
|
|
@ -0,0 +1,11 @@
|
||||||
|
[package]
|
||||||
|
name = 'core_messages'
|
||||||
|
version = '1.0.0'
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
Wormhole = { local = "../../wormhole/" }
|
||||||
|
|
||||||
|
[addresses]
|
||||||
|
wormhole = "0xde0036a9600559e295d5f6802ef6f3f802f510366e0c23912b0655d972166017"
|
||||||
|
deployer = "0x277fa055b6a73c42c0662d5236c65c864ccbf2d4abd21f174a30c8b786eab84b"
|
||||||
|
core_messages = "0x277fa055b6a73c42c0662d5236c65c864ccbf2d4abd21f174a30c8b786eab84b"
|
|
@ -0,0 +1,84 @@
|
||||||
|
/// A simple contracts that demonstrates how to send messages with wormhole.
|
||||||
|
module core_messages::sender {
|
||||||
|
use wormhole::wormhole;
|
||||||
|
use aptos_framework::coin;
|
||||||
|
|
||||||
|
struct State has key {
|
||||||
|
emitter_cap: wormhole::emitter::EmitterCapability,
|
||||||
|
}
|
||||||
|
|
||||||
|
entry fun init_module(core_messages: &signer) {
|
||||||
|
// Register ourselves as a wormhole emitter. This gives back an
|
||||||
|
// `EmitterCapability` which will be required to send messages through
|
||||||
|
// wormhole.
|
||||||
|
let emitter_cap = wormhole::register_emitter();
|
||||||
|
move_to(core_messages, State { emitter_cap });
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test_only]
|
||||||
|
/// Initialise module for testing.
|
||||||
|
public fun init_module_test() {
|
||||||
|
use aptos_framework::account;
|
||||||
|
// recover the signer for the module's account
|
||||||
|
let signer_cap = account::create_test_signer_cap(@core_messages);
|
||||||
|
let signer = account::create_signer_with_capability(&signer_cap);
|
||||||
|
// then call the initialiser
|
||||||
|
init_module(&signer)
|
||||||
|
}
|
||||||
|
|
||||||
|
public entry fun send_message(user: &signer, payload: vector<u8>) acquires State {
|
||||||
|
// Retrieve emitter capability from the state
|
||||||
|
let emitter_cap = &mut borrow_global_mut<State>(@core_messages).emitter_cap;
|
||||||
|
|
||||||
|
// Set nonce to 0 (this field is not interesting for regular messages,
|
||||||
|
// only batch VAAs)
|
||||||
|
let nonce: u64 = 0;
|
||||||
|
|
||||||
|
let message_fee = wormhole::state::get_message_fee();
|
||||||
|
let fee_coins = coin::withdraw(user, message_fee);
|
||||||
|
|
||||||
|
let _sequence = wormhole::publish_message(
|
||||||
|
emitter_cap,
|
||||||
|
nonce,
|
||||||
|
payload,
|
||||||
|
fee_coins
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test_only]
|
||||||
|
module core_messages::sender_test {
|
||||||
|
use wormhole::wormhole;
|
||||||
|
use core_messages::sender;
|
||||||
|
use aptos_framework::account;
|
||||||
|
use aptos_framework::aptos_coin::{Self, AptosCoin};
|
||||||
|
use aptos_framework::coin;
|
||||||
|
use aptos_framework::signer;
|
||||||
|
use aptos_framework::timestamp;
|
||||||
|
|
||||||
|
#[test(aptos_framework = @aptos_framework, user = @0x111)]
|
||||||
|
public fun test_send_message(aptos_framework: &signer, user: &signer) {
|
||||||
|
let message_fee = 100;
|
||||||
|
timestamp::set_time_has_started_for_testing(aptos_framework);
|
||||||
|
wormhole::init_test(
|
||||||
|
22,
|
||||||
|
1,
|
||||||
|
x"0000000000000000000000000000000000000000000000000000000000000004",
|
||||||
|
x"beFA429d57cD18b7F8A4d91A2da9AB4AF05d0FBe",
|
||||||
|
message_fee
|
||||||
|
);
|
||||||
|
sender::init_module_test();
|
||||||
|
|
||||||
|
let (burn_cap, mint_cap) = aptos_coin::initialize_for_test(aptos_framework);
|
||||||
|
|
||||||
|
// create user account and airdrop coins
|
||||||
|
account::create_account_for_test(signer::address_of(user));
|
||||||
|
coin::register<AptosCoin>(user);
|
||||||
|
coin::deposit(signer::address_of(user), coin::mint(message_fee, &mint_cap));
|
||||||
|
|
||||||
|
sender::send_message(user, b"hi mom");
|
||||||
|
|
||||||
|
coin::destroy_mint_cap(mint_cap);
|
||||||
|
coin::destroy_burn_cap(burn_cap);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue