Skip to content

Commit f47f15d

Browse files
authored
fix: In MsgSend, use Coin. Add expo API function makeSendTx (#191)
The gnoclient API uses `MsgSend` where the amount is an [array of `Coin`](https://github.com/gnolang/gno/blob/287c22ec830a1408f1d3de6319602640d841c7cc/tm2/pkg/sdk/bank/msgs.go#L17). A `Coin` is a struct with [separate fields for Denom and Amount.](https://github.com/gnolang/gno/blob/287c22ec830a1408f1d3de6319602640d841c7cc/tm2/pkg/std/coin.go#L19) However, the Gno Native Kit API uses a string such as "1000ugnot" (from the original version of gnoclient). We want to track the current gnoclient API. This PR has four commits: 1. Change the Protobuf `MsgSend` to use an array of `Coin` for the Amount. (The Protobuf `Coin` type was already defined.) Run `make regenerate` to make the native interfaces. Update `gnoNativeService.Send` to use the `Coin` struct. Run `npm install @gnolang/gnonative` to install the new API on buf.build. 2. In expo, update package.json to use the updated bufbuild_es types. Update `send` to take an array of `Coin`. 3. In expo, for making individual transactions we already have `makeCallTx`. Add `makeSendTx`. 4. In expo, in `makeCallTx` and `makeSendTx`, the callerAddress should not be optional. (This should have been fixed for `makeCallTx` in PR #184 .) This was tested by making a local expo NPM package and installing locally in Gnokey Mobile. The following test code sends 100 ugnot to an address. ``` const test_addr = await gnonative.addressFromBech32("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"); const tx = await gnonative.makeSendTx(test_addr, [new Coin({denom: "ugnot", amount: BigInt(100)})], "1ugnot", BigInt(10000000), keyInfo.address); const signedTx = await gnonative.signTx(tx.txJson, keyInfo.address); await gnonative.broadcastTxCommit(signedTx.signedTxJson); ``` --------- Signed-off-by: Jeff Thompson <[email protected]>
1 parent 53473b6 commit f47f15d

12 files changed

+239
-201
lines changed

api/gen/csharp/Gnonativetypes.cs

+57-64
Original file line numberDiff line numberDiff line change
@@ -99,41 +99,42 @@ static GnonativetypesReflection() {
9999
"UglnYXNXYW50ZWQSEgoEbWVtbxgDIAEoCVIEbWVtbxIlCg5jYWxsZXJfYWRk",
100100
"cmVzcxgEIAEoDFINY2FsbGVyQWRkcmVzcxIyCgRtc2dzGAUgAygLMh4ubGFu",
101101
"ZC5nbm8uZ25vbmF0aXZlLnYxLk1zZ0NhbGxSBE1zZ3MiJgoMQ2FsbFJlc3Bv",
102-
"bnNlEhYKBnJlc3VsdBgBIAEoDFIGcmVzdWx0IjwKB01zZ1NlbmQSHQoKdG9f",
103-
"YWRkcmVzcxgBIAEoDFIJdG9BZGRyZXNzEhIKBHNlbmQYAiABKAlSBHNlbmQi",
104-
"tAEKC1NlbmRSZXF1ZXN0EhcKB2dhc19mZWUYASABKAlSBmdhc0ZlZRIdCgpn",
105-
"YXNfd2FudGVkGAIgASgSUglnYXNXYW50ZWQSEgoEbWVtbxgDIAEoCVIEbWVt",
106-
"bxIlCg5jYWxsZXJfYWRkcmVzcxgEIAEoDFINY2FsbGVyQWRkcmVzcxIyCgRt",
107-
"c2dzGAUgAygLMh4ubGFuZC5nbm8uZ25vbmF0aXZlLnYxLk1zZ1NlbmRSBE1z",
108-
"Z3MiDgoMU2VuZFJlc3BvbnNlIjYKBk1zZ1J1bhIYCgdwYWNrYWdlGAEgASgJ",
109-
"UgdwYWNrYWdlEhIKBHNlbmQYAiABKAlSBHNlbmQisgEKClJ1blJlcXVlc3QS",
110-
"FwoHZ2FzX2ZlZRgBIAEoCVIGZ2FzRmVlEh0KCmdhc193YW50ZWQYAiABKBJS",
111-
"CWdhc1dhbnRlZBISCgRtZW1vGAMgASgJUgRtZW1vEiUKDmNhbGxlcl9hZGRy",
112-
"ZXNzGAQgASgMUg1jYWxsZXJBZGRyZXNzEjEKBG1zZ3MYBSADKAsyHS5sYW5k",
113-
"Lmduby5nbm9uYXRpdmUudjEuTXNnUnVuUgRNc2dzIiUKC1J1blJlc3BvbnNl",
114-
"EhYKBnJlc3VsdBgBIAEoCVIGcmVzdWx0IikKDk1ha2VUeFJlc3BvbnNlEhcK",
115-
"B3R4X2pzb24YASABKAlSBnR4SnNvbiKSAQoNU2lnblR4UmVxdWVzdBIXCgd0",
116-
"eF9qc29uGAEgASgJUgZ0eEpzb24SGAoHYWRkcmVzcxgCIAEoDFIHYWRkcmVz",
117-
"cxIlCg5hY2NvdW50X251bWJlchgDIAEoBFINYWNjb3VudE51bWJlchInCg9z",
118-
"ZXF1ZW5jZV9udW1iZXIYBCABKARSDnNlcXVlbmNlTnVtYmVyIjEKDlNpZ25U",
119-
"eFJlc3BvbnNlEh8KDnNpZ25lZF90eF9qc29uGAEgASgJUgd0eF9qc29uIjsK",
120-
"GEJyb2FkY2FzdFR4Q29tbWl0UmVxdWVzdBIfCg5zaWduZWRfdHhfanNvbhgB",
121-
"IAEoCVIHdHhfanNvbiIzChlCcm9hZGNhc3RUeENvbW1pdFJlc3BvbnNlEhYK",
122-
"BnJlc3VsdBgBIAEoDFIGcmVzdWx0IjIKFkFkZHJlc3NUb0JlY2gzMlJlcXVl",
123-
"c3QSGAoHYWRkcmVzcxgBIAEoDFIHYWRkcmVzcyJAChdBZGRyZXNzVG9CZWNo",
124-
"MzJSZXNwb25zZRIlCg5iZWNoMzJfYWRkcmVzcxgBIAEoCVINYmVjaDMyQWRk",
125-
"cmVzcyJBChhBZGRyZXNzRnJvbUJlY2gzMlJlcXVlc3QSJQoOYmVjaDMyX2Fk",
126-
"ZHJlc3MYASABKAlSDWJlY2gzMkFkZHJlc3MiNQoZQWRkcmVzc0Zyb21CZWNo",
127-
"MzJSZXNwb25zZRIYCgdhZGRyZXNzGAEgASgMUgdhZGRyZXNzIjgKGkFkZHJl",
128-
"c3NGcm9tTW5lbW9uaWNSZXF1ZXN0EhoKCG1uZW1vbmljGAEgASgJUghtbmVt",
129-
"b25pYyI3ChtBZGRyZXNzRnJvbU1uZW1vbmljUmVzcG9uc2USGAoHYWRkcmVz",
130-
"cxgBIAEoDFIHYWRkcmVzcyIiCgxIZWxsb1JlcXVlc3QSEgoEbmFtZRgBIAEo",
131-
"CVIETmFtZSIrCg1IZWxsb1Jlc3BvbnNlEhoKCGdyZWV0aW5nGAEgASgJUghH",
132-
"cmVldGluZyIoChJIZWxsb1N0cmVhbVJlcXVlc3QSEgoEbmFtZRgBIAEoCVIE",
133-
"TmFtZSIxChNIZWxsb1N0cmVhbVJlc3BvbnNlEhoKCGdyZWV0aW5nGAEgASgJ",
134-
"UghHcmVldGluZyIwChhHTk9OQVRJVkVUWVBFU19CeXRlc0xpc3QSFAoFVmFs",
135-
"dWUYASADKAxSBVZhbHVlQilaJ2dpdGh1Yi5jb20vZ25vbGFuZy9nbm9uYXRp",
136-
"dmUvYXBpL2dlbi9nb2IGcHJvdG8z"));
102+
"bnNlEhYKBnJlc3VsdBgBIAEoDFIGcmVzdWx0Il0KB01zZ1NlbmQSHQoKdG9f",
103+
"YWRkcmVzcxgBIAEoDFIJdG9BZGRyZXNzEjMKBmFtb3VudBgCIAMoCzIbLmxh",
104+
"bmQuZ25vLmdub25hdGl2ZS52MS5Db2luUgZhbW91bnQitAEKC1NlbmRSZXF1",
105+
"ZXN0EhcKB2dhc19mZWUYASABKAlSBmdhc0ZlZRIdCgpnYXNfd2FudGVkGAIg",
106+
"ASgSUglnYXNXYW50ZWQSEgoEbWVtbxgDIAEoCVIEbWVtbxIlCg5jYWxsZXJf",
107+
"YWRkcmVzcxgEIAEoDFINY2FsbGVyQWRkcmVzcxIyCgRtc2dzGAUgAygLMh4u",
108+
"bGFuZC5nbm8uZ25vbmF0aXZlLnYxLk1zZ1NlbmRSBE1zZ3MiDgoMU2VuZFJl",
109+
"c3BvbnNlIjYKBk1zZ1J1bhIYCgdwYWNrYWdlGAEgASgJUgdwYWNrYWdlEhIK",
110+
"BHNlbmQYAiABKAlSBHNlbmQisgEKClJ1blJlcXVlc3QSFwoHZ2FzX2ZlZRgB",
111+
"IAEoCVIGZ2FzRmVlEh0KCmdhc193YW50ZWQYAiABKBJSCWdhc1dhbnRlZBIS",
112+
"CgRtZW1vGAMgASgJUgRtZW1vEiUKDmNhbGxlcl9hZGRyZXNzGAQgASgMUg1j",
113+
"YWxsZXJBZGRyZXNzEjEKBG1zZ3MYBSADKAsyHS5sYW5kLmduby5nbm9uYXRp",
114+
"dmUudjEuTXNnUnVuUgRNc2dzIiUKC1J1blJlc3BvbnNlEhYKBnJlc3VsdBgB",
115+
"IAEoCVIGcmVzdWx0IikKDk1ha2VUeFJlc3BvbnNlEhcKB3R4X2pzb24YASAB",
116+
"KAlSBnR4SnNvbiKSAQoNU2lnblR4UmVxdWVzdBIXCgd0eF9qc29uGAEgASgJ",
117+
"UgZ0eEpzb24SGAoHYWRkcmVzcxgCIAEoDFIHYWRkcmVzcxIlCg5hY2NvdW50",
118+
"X251bWJlchgDIAEoBFINYWNjb3VudE51bWJlchInCg9zZXF1ZW5jZV9udW1i",
119+
"ZXIYBCABKARSDnNlcXVlbmNlTnVtYmVyIjEKDlNpZ25UeFJlc3BvbnNlEh8K",
120+
"DnNpZ25lZF90eF9qc29uGAEgASgJUgd0eF9qc29uIjsKGEJyb2FkY2FzdFR4",
121+
"Q29tbWl0UmVxdWVzdBIfCg5zaWduZWRfdHhfanNvbhgBIAEoCVIHdHhfanNv",
122+
"biIzChlCcm9hZGNhc3RUeENvbW1pdFJlc3BvbnNlEhYKBnJlc3VsdBgBIAEo",
123+
"DFIGcmVzdWx0IjIKFkFkZHJlc3NUb0JlY2gzMlJlcXVlc3QSGAoHYWRkcmVz",
124+
"cxgBIAEoDFIHYWRkcmVzcyJAChdBZGRyZXNzVG9CZWNoMzJSZXNwb25zZRIl",
125+
"Cg5iZWNoMzJfYWRkcmVzcxgBIAEoCVINYmVjaDMyQWRkcmVzcyJBChhBZGRy",
126+
"ZXNzRnJvbUJlY2gzMlJlcXVlc3QSJQoOYmVjaDMyX2FkZHJlc3MYASABKAlS",
127+
"DWJlY2gzMkFkZHJlc3MiNQoZQWRkcmVzc0Zyb21CZWNoMzJSZXNwb25zZRIY",
128+
"CgdhZGRyZXNzGAEgASgMUgdhZGRyZXNzIjgKGkFkZHJlc3NGcm9tTW5lbW9u",
129+
"aWNSZXF1ZXN0EhoKCG1uZW1vbmljGAEgASgJUghtbmVtb25pYyI3ChtBZGRy",
130+
"ZXNzRnJvbU1uZW1vbmljUmVzcG9uc2USGAoHYWRkcmVzcxgBIAEoDFIHYWRk",
131+
"cmVzcyIiCgxIZWxsb1JlcXVlc3QSEgoEbmFtZRgBIAEoCVIETmFtZSIrCg1I",
132+
"ZWxsb1Jlc3BvbnNlEhoKCGdyZWV0aW5nGAEgASgJUghHcmVldGluZyIoChJI",
133+
"ZWxsb1N0cmVhbVJlcXVlc3QSEgoEbmFtZRgBIAEoCVIETmFtZSIxChNIZWxs",
134+
"b1N0cmVhbVJlc3BvbnNlEhoKCGdyZWV0aW5nGAEgASgJUghHcmVldGluZyIw",
135+
"ChhHTk9OQVRJVkVUWVBFU19CeXRlc0xpc3QSFAoFVmFsdWUYASADKAxSBVZh",
136+
"bHVlQilaJ2dpdGh1Yi5jb20vZ25vbGFuZy9nbm9uYXRpdmUvYXBpL2dlbi9n",
137+
"b2IGcHJvdG8z"));
137138
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
138139
new pbr::FileDescriptor[] { },
139140
new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {
@@ -187,7 +188,7 @@ static GnonativetypesReflection() {
187188
new pbr::GeneratedClrTypeInfo(typeof(global::Land.Gno.Gnonative.V1.MsgCall), global::Land.Gno.Gnonative.V1.MsgCall.Parser, new[]{ "PackagePath", "Fnc", "Args", "Send" }, null, null, null, null),
188189
new pbr::GeneratedClrTypeInfo(typeof(global::Land.Gno.Gnonative.V1.CallRequest), global::Land.Gno.Gnonative.V1.CallRequest.Parser, new[]{ "GasFee", "GasWanted", "Memo", "CallerAddress", "Msgs" }, null, null, null, null),
189190
new pbr::GeneratedClrTypeInfo(typeof(global::Land.Gno.Gnonative.V1.CallResponse), global::Land.Gno.Gnonative.V1.CallResponse.Parser, new[]{ "Result" }, null, null, null, null),
190-
new pbr::GeneratedClrTypeInfo(typeof(global::Land.Gno.Gnonative.V1.MsgSend), global::Land.Gno.Gnonative.V1.MsgSend.Parser, new[]{ "ToAddress", "Send" }, null, null, null, null),
191+
new pbr::GeneratedClrTypeInfo(typeof(global::Land.Gno.Gnonative.V1.MsgSend), global::Land.Gno.Gnonative.V1.MsgSend.Parser, new[]{ "ToAddress", "Amount" }, null, null, null, null),
191192
new pbr::GeneratedClrTypeInfo(typeof(global::Land.Gno.Gnonative.V1.SendRequest), global::Land.Gno.Gnonative.V1.SendRequest.Parser, new[]{ "GasFee", "GasWanted", "Memo", "CallerAddress", "Msgs" }, null, null, null, null),
192193
new pbr::GeneratedClrTypeInfo(typeof(global::Land.Gno.Gnonative.V1.SendResponse), global::Land.Gno.Gnonative.V1.SendResponse.Parser, null, null, null, null, null),
193194
new pbr::GeneratedClrTypeInfo(typeof(global::Land.Gno.Gnonative.V1.MsgRun), global::Land.Gno.Gnonative.V1.MsgRun.Parser, new[]{ "Package", "Send" }, null, null, null, null),
@@ -3165,6 +3166,9 @@ public Coin Clone() {
31653166
/// <summary>Field number for the "denom" field.</summary>
31663167
public const int DenomFieldNumber = 1;
31673168
private string denom_ = "";
3169+
/// <summary>
3170+
/// Example: "ugnot"
3171+
/// </summary>
31683172
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
31693173
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
31703174
public string Denom {
@@ -10961,7 +10965,7 @@ public MsgSend() {
1096110965
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
1096210966
public MsgSend(MsgSend other) : this() {
1096310967
toAddress_ = other.toAddress_;
10964-
send_ = other.send_;
10968+
amount_ = other.amount_.Clone();
1096510969
_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
1096610970
}
1096710971

@@ -10987,19 +10991,18 @@ public MsgSend Clone() {
1098710991
}
1098810992
}
1098910993

10990-
/// <summary>Field number for the "send" field.</summary>
10991-
public const int SendFieldNumber = 2;
10992-
private string send_ = "";
10994+
/// <summary>Field number for the "amount" field.</summary>
10995+
public const int AmountFieldNumber = 2;
10996+
private static readonly pb::FieldCodec<global::Land.Gno.Gnonative.V1.Coin> _repeated_amount_codec
10997+
= pb::FieldCodec.ForMessage(18, global::Land.Gno.Gnonative.V1.Coin.Parser);
10998+
private readonly pbc::RepeatedField<global::Land.Gno.Gnonative.V1.Coin> amount_ = new pbc::RepeatedField<global::Land.Gno.Gnonative.V1.Coin>();
1099310999
/// <summary>
10994-
/// Example: "1000ugnot"
11000+
/// Example: [ {Denom: "ugnot", Amount: 1000} ]
1099511001
/// </summary>
1099611002
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
1099711003
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
10998-
public string Send {
10999-
get { return send_; }
11000-
set {
11001-
send_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
11002-
}
11004+
public pbc::RepeatedField<global::Land.Gno.Gnonative.V1.Coin> Amount {
11005+
get { return amount_; }
1100311006
}
1100411007

1100511008
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -11018,7 +11021,7 @@ public bool Equals(MsgSend other) {
1101811021
return true;
1101911022
}
1102011023
if (ToAddress != other.ToAddress) return false;
11021-
if (Send != other.Send) return false;
11024+
if(!amount_.Equals(other.amount_)) return false;
1102211025
return Equals(_unknownFields, other._unknownFields);
1102311026
}
1102411027

@@ -11027,7 +11030,7 @@ public bool Equals(MsgSend other) {
1102711030
public override int GetHashCode() {
1102811031
int hash = 1;
1102911032
if (ToAddress.Length != 0) hash ^= ToAddress.GetHashCode();
11030-
if (Send.Length != 0) hash ^= Send.GetHashCode();
11033+
hash ^= amount_.GetHashCode();
1103111034
if (_unknownFields != null) {
1103211035
hash ^= _unknownFields.GetHashCode();
1103311036
}
@@ -11050,10 +11053,7 @@ public void WriteTo(pb::CodedOutputStream output) {
1105011053
output.WriteRawTag(10);
1105111054
output.WriteBytes(ToAddress);
1105211055
}
11053-
if (Send.Length != 0) {
11054-
output.WriteRawTag(18);
11055-
output.WriteString(Send);
11056-
}
11056+
amount_.WriteTo(output, _repeated_amount_codec);
1105711057
if (_unknownFields != null) {
1105811058
_unknownFields.WriteTo(output);
1105911059
}
@@ -11068,10 +11068,7 @@ public void WriteTo(pb::CodedOutputStream output) {
1106811068
output.WriteRawTag(10);
1106911069
output.WriteBytes(ToAddress);
1107011070
}
11071-
if (Send.Length != 0) {
11072-
output.WriteRawTag(18);
11073-
output.WriteString(Send);
11074-
}
11071+
amount_.WriteTo(ref output, _repeated_amount_codec);
1107511072
if (_unknownFields != null) {
1107611073
_unknownFields.WriteTo(ref output);
1107711074
}
@@ -11085,9 +11082,7 @@ public int CalculateSize() {
1108511082
if (ToAddress.Length != 0) {
1108611083
size += 1 + pb::CodedOutputStream.ComputeBytesSize(ToAddress);
1108711084
}
11088-
if (Send.Length != 0) {
11089-
size += 1 + pb::CodedOutputStream.ComputeStringSize(Send);
11090-
}
11085+
size += amount_.CalculateSize(_repeated_amount_codec);
1109111086
if (_unknownFields != null) {
1109211087
size += _unknownFields.CalculateSize();
1109311088
}
@@ -11103,9 +11098,7 @@ public void MergeFrom(MsgSend other) {
1110311098
if (other.ToAddress.Length != 0) {
1110411099
ToAddress = other.ToAddress;
1110511100
}
11106-
if (other.Send.Length != 0) {
11107-
Send = other.Send;
11108-
}
11101+
amount_.Add(other.amount_);
1110911102
_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
1111011103
}
1111111104

@@ -11130,7 +11123,7 @@ public void MergeFrom(pb::CodedInputStream input) {
1113011123
break;
1113111124
}
1113211125
case 18: {
11133-
Send = input.ReadString();
11126+
amount_.AddEntriesFrom(input, _repeated_amount_codec);
1113411127
break;
1113511128
}
1113611129
}
@@ -11157,7 +11150,7 @@ public void MergeFrom(pb::CodedInputStream input) {
1115711150
break;
1115811151
}
1115911152
case 18: {
11160-
Send = input.ReadString();
11153+
amount_.AddEntriesFrom(ref input, _repeated_amount_codec);
1116111154
break;
1116211155
}
1116311156
}

api/gen/es/gnonativetypes_pb.d.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,8 @@ export declare class KeyInfo extends Message<KeyInfo> {
372372
*/
373373
export declare class Coin extends Message<Coin> {
374374
/**
375+
* Example: "ugnot"
376+
*
375377
* @generated from field: string denom = 1;
376378
*/
377379
denom: string;
@@ -1361,11 +1363,11 @@ export declare class MsgSend extends Message<MsgSend> {
13611363
toAddress: Uint8Array;
13621364

13631365
/**
1364-
* Example: "1000ugnot"
1366+
* Example: [ {Denom: "ugnot", Amount: 1000} ]
13651367
*
1366-
* @generated from field: string send = 2;
1368+
* @generated from field: repeated land.gno.gnonative.v1.Coin amount = 2;
13671369
*/
1368-
send: string;
1370+
amount: Coin[];
13691371

13701372
constructor(data?: PartialMessage<MsgSend>);
13711373

api/gen/es/gnonativetypes_pb.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ export const MsgSend = proto3.makeMessageType(
528528
"land.gno.gnonative.v1.MsgSend",
529529
() => [
530530
{ no: 1, name: "to_address", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
531-
{ no: 2, name: "send", kind: "scalar", T: 9 /* ScalarType.STRING */ },
531+
{ no: 2, name: "amount", kind: "message", T: Coin, repeated: true },
532532
],
533533
);
534534

0 commit comments

Comments
 (0)