Skip to content

Commit c122749

Browse files
committed
feat: expose ERC20 token originalAmount field
1 parent a9280eb commit c122749

File tree

3 files changed

+32
-2
lines changed

3 files changed

+32
-2
lines changed

module.flow.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ declare module '@solana/web3.js' {
114114
owner: PublicKey;
115115
amount: TokenAmount;
116116
source: null | PublicKey;
117+
originalAmount: TokenAmount;
117118
|}
118119
declare type TokenAndPublicKey = [Token, PublicKey];
119120

src/token-program.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,12 @@ type TokenAccountInfo = {|
111111
* an allowance of tokens that may be transferred from the source account
112112
*/
113113
source: null | PublicKey,
114+
115+
/**
116+
* Original amount of tokens this delegate account was authorized to spend
117+
* If `source` is null, originalAmount is zero
118+
*/
119+
originalAmount: TokenAmount,
114120
|};
115121

116122
/**
@@ -122,6 +128,7 @@ const TokenAccountInfoLayout = BufferLayout.struct([
122128
Layout.uint64('amount'),
123129
BufferLayout.u8('sourceOption'),
124130
Layout.publicKey('source'),
131+
Layout.uint64('originalAmount'),
125132
]);
126133

127134

@@ -320,7 +327,13 @@ export class Token {
320327
tokenAccountInfo.token = new PublicKey(tokenAccountInfo.token);
321328
tokenAccountInfo.owner = new PublicKey(tokenAccountInfo.owner);
322329
tokenAccountInfo.amount = TokenAmount.fromBuffer(tokenAccountInfo.amount);
323-
tokenAccountInfo.source = tokenAccountInfo.sourceOption === 0 ? null : new PublicKey(tokenAccountInfo.source);
330+
if (tokenAccountInfo.sourceOption === 0) {
331+
tokenAccountInfo.source = null;
332+
tokenAccountInfo.originalAmount = new TokenAmount();
333+
} else {
334+
tokenAccountInfo.source = new PublicKey(tokenAccountInfo.source);
335+
tokenAccountInfo.originalAmount = TokenAmount.fromBuffer(tokenAccountInfo.originalAmount);
336+
}
324337

325338
if (!tokenAccountInfo.token.equals(this.token)) {
326339
throw new Error(

test/token-program.test.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ test('create new token', async () => {
174174
expect(accountInfo.owner.equals(initialOwner.publicKey)).toBe(true);
175175
expect(accountInfo.amount.toNumber()).toBe(10000);
176176
expect(accountInfo.source).toBe(null);
177+
expect(accountInfo.originalAmount.toNumber()).toBe(0);
177178
});
178179

179180

@@ -379,6 +380,7 @@ test('approve/revoke', async () => {
379380
200, 1, 0, 0, 0, 0, 0, 0,
380381
1,
381382
...initialOwnerTokenAccount.toBuffer(),
383+
200, 1, 0, 0, 0, 0, 0, 0,
382384
],
383385
executable: false,
384386
loader_program_id: [
@@ -393,6 +395,7 @@ test('approve/revoke', async () => {
393395
let delegateAccountInfo = await testToken.accountInfo(delegate);
394396

395397
expect(delegateAccountInfo.amount.toNumber()).toBe(456);
398+
expect(delegateAccountInfo.originalAmount.toNumber()).toBe(456);
396399
if (delegateAccountInfo.source === null) {
397400
throw new Error('source should not be null');
398401
} else {
@@ -432,6 +435,7 @@ test('approve/revoke', async () => {
432435
0, 0, 0, 0, 0, 0, 0, 0,
433436
1,
434437
...initialOwnerTokenAccount.toBuffer(),
438+
0, 0, 0, 0, 0, 0, 0, 0,
435439
],
436440
executable: false,
437441
loader_program_id: [
@@ -444,8 +448,8 @@ test('approve/revoke', async () => {
444448
}
445449

446450
delegateAccountInfo = await testToken.accountInfo(delegate);
447-
448451
expect(delegateAccountInfo.amount.toNumber()).toBe(0);
452+
expect(delegateAccountInfo.originalAmount.toNumber()).toBe(0);
449453
if (delegateAccountInfo.source === null) {
450454
throw new Error('source should not be null');
451455
} else {
@@ -517,20 +521,32 @@ test.skip('fail on approve overspend', async () => {
517521
2
518522
);
519523

524+
let delegateAccountInfo = await testToken.accountInfo(account1Delegate);
525+
expect(delegateAccountInfo.amount.toNumber()).toBe(2);
526+
expect(delegateAccountInfo.originalAmount.toNumber()).toBe(2);
527+
520528
await testToken.transfer(
521529
owner,
522530
account1Delegate,
523531
account2,
524532
1,
525533
);
526534

535+
delegateAccountInfo = await testToken.accountInfo(account1Delegate);
536+
expect(delegateAccountInfo.amount.toNumber()).toBe(1);
537+
expect(delegateAccountInfo.originalAmount.toNumber()).toBe(2);
538+
527539
await testToken.transfer(
528540
owner,
529541
account1Delegate,
530542
account2,
531543
1,
532544
);
533545

546+
delegateAccountInfo = await testToken.accountInfo(account1Delegate);
547+
expect(delegateAccountInfo.amount.toNumber()).toBe(0);
548+
expect(delegateAccountInfo.originalAmount.toNumber()).toBe(2);
549+
534550
expect(
535551
testToken.transfer(
536552
owner,

0 commit comments

Comments
 (0)